创建一个用于转发视频流的服务器

1、

我们需要创建两个类(字面理解可以叫:环境类和调度类)

TaskScheduler* scheduler = BasicTaskScheduler::createNew();
UsageEnvironment* env = BasicUsageEnvironment::createNew(*scheduler);

接着需要设置我们接受视频流的缓冲区的大小

 OutPacketBuffer::maxSize = 1000000; // bytes

这里的缓冲区大小将影响视频的播放效果,比如一开始我的这里设置的比较小,转发来的视频流播放时只有一半有画面,另一半是黑色的

2、

创建一个指向RTSP服务器对象的指针,调用成员函数createRTSPServer
来初始化该对象,在初始化的时候指定端口号

RTSPServer* rtspServer;
rtspServer = createRTSPServer(rtspServerPortNum);

对创建的对象是否成功做检查(一般,RTSP的端口指定554或者8554,所以检查时若是554无法创建,则使用8554,若8554也无法创建,程序退出返回错误码)

if (rtspServer == NULL) {
    if (rtspServerPortNum != 554) {
      *env << "Unable to create a RTSP server with port number " << rtspServerPortNum << ": " << env->getResultMsg() << "\n";
      *env << "Trying instead with the standard port numbers (554 and 8554)...\n";

      rtspServerPortNum = 554;
      rtspServer = createRTSPServer(rtspServerPortNum);
    }
  }
if (rtspServer == NULL) {
    rtspServerPortNum = 8554;
    rtspServer = createRTSPServer(rtspServerPortNum);
  }
if (rtspServer == NULL) {
    *env << "Failed to create RTSP server: " << env->getResultMsg() << "\n";
    exit(1);
  }
3、
 for (i = 1; i < argc; ++i) {
    char const* proxiedStreamURL = argv[i];
    char streamName[30];
    if (argc == 2) {
      sprintf(streamName, "%s", "proxyStream"); // there's just one stream; give it this name
    } else {
      sprintf(streamName, "proxyStream-%d", i); // there's more than one stream; distinguish them by name
    }
    .......

解释下这里是干什么
这个是为转发多个视频流的时候设计的,若是只有一路视频流,在连接服务器时URL直接给proxyStream,若是有多路,则顺次为proxyStream-1、proxyStream-2…
当然了,转发几路的视频流由启动程序时的参数决定

4、

创建ServerMediaSession类对象,这个类就是对应的媒体文件,在live555源代码中,ServerMediaSession下有不同类型的子类,我们这里是需要转发视频流,所以找到ProxyServerMediaSession,利用成员函数createNew初始化

ServerMediaSession* sms
      = ProxyServerMediaSession::createNew(*env, rtspServer,
					   proxiedStreamURL, streamName,
					   username, password, tunnelOverHTTPPortNum, verbosityLevel);
5、

将创建好的sms加入到我们的RTSP服务器中
利用RTSPServer的成员函数addServerMediaSession

rtspServer->addServerMediaSession(sms);

下面这个是一个获取服务器可用URL的方法,利用RTSPServer的成员函数rtspURL(ServerMediaSession*)
还记得第一步创建的env吧,因为重载了<<操作符,它可以向屏幕输出

char* proxyStreamURL = rtspServer->rtspURL(sms);
    *env << "\tPlay this stream using the URL: " << proxyStreamURL << "\n";
    delete[] proxyStreamURL;	//NO内存泄漏
6、

完成基本操作,进入调度循环

 env->taskScheduler().doEventLoop(); // does not return
7、测试


URL地址
摄像头居然对准了某领导........

发布了46 篇原创文章 · 获赞 13 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_42718004/article/details/90445230
今日推荐