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

    xiaoxiao2022-07-04  141

    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、测试

    最新回复(0)