我们需要创建两个类(字面理解可以叫:环境类和调度类)
TaskScheduler* scheduler = BasicTaskScheduler::createNew(); UsageEnvironment* env = BasicUsageEnvironment::createNew(*scheduler);接着需要设置我们接受视频流的缓冲区的大小
OutPacketBuffer::maxSize = 1000000; // bytes这里的缓冲区大小将影响视频的播放效果,比如一开始我的这里设置的比较小,转发来的视频流播放时只有一半有画面,另一半是黑色的
创建一个指向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); }解释下这里是干什么 这个是为转发多个视频流的时候设计的,若是只有一路视频流,在连接服务器时URL直接给proxyStream,若是有多路,则顺次为proxyStream-1、proxyStream-2… 当然了,转发几路的视频流由启动程序时的参数决定
创建ServerMediaSession类对象,这个类就是对应的媒体文件,在live555源代码中,ServerMediaSession下有不同类型的子类,我们这里是需要转发视频流,所以找到ProxyServerMediaSession,利用成员函数createNew初始化
ServerMediaSession* sms = ProxyServerMediaSession::createNew(*env, rtspServer, proxiedStreamURL, streamName, username, password, tunnelOverHTTPPortNum, verbosityLevel);将创建好的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内存泄漏完成基本操作,进入调度循环
env->taskScheduler().doEventLoop(); // does not return