zoukankan      html  css  js  c++  java
  • live传264流

    简单的rtsp服务器客户    https://github.com/fengweiyu/RTSP

    264 flv等简单解析

    simplest_mediadata_test-master

    1、更简单的看看

     https://hub.fastgit.org/ImSjt/RtspServer

    2、 要看https://blog.csdn.net/gavinr/article/details/7186843

    通过改testH264VideoStreamer和testProgs\testOnDemandRTSPServer.cpp

    加入斜体的那一段

    #include <liveMedia.hh>
    #include <BasicUsageEnvironment.hh>
    #include <GroupsockHelper.hh>
    
    UsageEnvironment* env;
    char const* inputFileName = "test.264";
    H264VideoStreamFramer* videoSource;
    RTPSink* videoSink;
    
    void play(); // forward
    static void announceStream(RTSPServer* rtspServer, ServerMediaSession* sms,
        char const* streamName, char const* inputFileName) {
        char* url = rtspServer->rtspURL(sms);
        UsageEnvironment& env = rtspServer->envir();
        env << "\n\"" << streamName << "\" stream, from the file \""
            << inputFileName << "\"\n";
        env << "Play this stream using the URL \"" << url << "\"\n";
        delete[] url;
    };
    int main(int argc, char** argv) {
      // Begin by setting up our usage environment:
      TaskScheduler* scheduler = BasicTaskScheduler::createNew();
      env = BasicUsageEnvironment::createNew(*scheduler);
    
      // Create 'groupsocks' for RTP and RTCP:
      struct sockaddr_storage destinationAddress;
      destinationAddress.ss_family = AF_INET;
      ((struct sockaddr_in&)destinationAddress).sin_addr.s_addr = chooseRandomIPv4SSMAddress(*env);
      // Note: This is a multicast address.  If you wish instead to stream
      // using unicast, then you should use the "testOnDemandRTSPServer"
      // test program - not this test program - as a model.
    
      const unsigned short rtpPortNum = 18888;
      const unsigned short rtcpPortNum = rtpPortNum+1;
      const unsigned char ttl = 255;
    
      const Port rtpPort(rtpPortNum);
      const Port rtcpPort(rtcpPortNum);
    
      Groupsock rtpGroupsock(*env, destinationAddress, rtpPort, ttl);
      rtpGroupsock.multicastSendOnly(); // we're a SSM source
      Groupsock rtcpGroupsock(*env, destinationAddress, rtcpPort, ttl);
      rtcpGroupsock.multicastSendOnly(); // we're a SSM source
    
      // Create a 'H264 Video RTP' sink from the RTP 'groupsock':
      OutPacketBuffer::maxSize = 100000;
      videoSink = H264VideoRTPSink::createNew(*env, &rtpGroupsock, 96);
    
      // Create (and start) a 'RTCP instance' for this RTP sink:
      const unsigned estimatedSessionBandwidth = 500; // in kbps; for RTCP b/w share
      const unsigned maxCNAMElen = 100;
      unsigned char CNAME[maxCNAMElen+1];
      gethostname((char*)CNAME, maxCNAMElen);
      CNAME[maxCNAMElen] = '\0'; // just in case
      RTCPInstance* rtcp
      = RTCPInstance::createNew(*env, &rtcpGroupsock,
                    estimatedSessionBandwidth, CNAME,
                    videoSink, NULL /* we're a server */,
                    True /* we're a SSM source */);
      // Note: This starts RTCP running automatically
    
      RTSPServer* rtspServer = RTSPServer::createNew(*env, 8554);
      if (rtspServer == NULL) {
        *env << "Failed to create RTSP server: " << env->getResultMsg() << "\n";
        exit(1);
      }
      ServerMediaSession* sms
        = ServerMediaSession::createNew(*env, "testStream", inputFileName,
               "Session streamed by \"testH264VideoStreamer\"",
                           True /*SSM*/);
      sms->addSubsession(PassiveServerMediaSubsession::createNew(*videoSink, rtcp));
      rtspServer->addServerMediaSession(sms);
    
      char* url = rtspServer->rtspURL(sms);
      *env << "Play this stream using the URL \"" << url << "\"\n";
      delete[] url;
    
      // Start the streaming:
      *env << "Beginning streaming...\n";
      play();
      // A H.264 video elementary stream:
      { 
          char const* descriptionString
              = "Session streamed by \"testOnDemandRTSPServer\"";
          Boolean reuseFirstSource = False;
          char const* streamName = "h264ESVideoTest";
          char const* inputFileName = "test.264";
          ServerMediaSession* sms
              = ServerMediaSession::createNew(*env, streamName, streamName,
                  descriptionString);
          sms->addSubsession(H264VideoFileServerMediaSubsession
              ::createNew(*env, inputFileName, reuseFirstSource));
          rtspServer->addServerMediaSession(sms);
    
          announceStream(rtspServer, sms, streamName, inputFileName);
      }
      env->taskScheduler().doEventLoop(); // does not return
    
      return 0; // only to prevent compiler warning
    }
    
    void afterPlaying(void* /*clientData*/) {
      *env << "...done reading from file\n";
      videoSink->stopPlaying();
      Medium::close(videoSource);
      // Note that this also closes the input file that this source read from.
    
      // Start playing once again:
      play();
    }
    
    void play() {
      // Open the input file as a 'byte-stream file source':
      ByteStreamFileSource* fileSource
        = ByteStreamFileSource::createNew(*env, inputFileName);
      if (fileSource == NULL) {
        *env << "Unable to open file \"" << inputFileName
             << "\" as a byte-stream file source\n";
        exit(1);
      }
    
      FramedSource* videoES = fileSource;
    
      // Create a framer for the Video Elementary Stream:
      videoSource = H264VideoStreamFramer::createNew(*env, videoES);
    
      // Finally, start playing:
      *env << "Beginning to read from file...\n";
      videoSink->startPlaying(*videoSource, afterPlaying, videoSink);
    }
  • 相关阅读:
    设置和查看时间
    通过linux ssh远程登录另一台Linux,无需密码,用证书验证
    openssl生成自签名证书
    技术集锦
    centos系统安装中文字体几种方法
    集群中几种session同步解决方案的比较
    leetcode 88. C++ 合并两个有序数组
    CycleGAN --- Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks
    剑指offer---二叉树的深度
    C++基础(2)
  • 原文地址:https://www.cnblogs.com/cnchengv/p/15586208.html
Copyright © 2011-2022 走看看