我们需要创建两个类(字面理解可以叫:环境类和调度类)
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);
}
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…
当然了,转发几路的视频流由启动程序时的参数决定
创建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