该方案的实现原理是,通过Live555的DarwinInjector Class,把本地采集的音频和视频流,注入到DSS服务器。客户端就可以直接访问DSS服务器(不是Live555所在的采集端)来访问实时流媒体数据。
这种方案的优点: 》保证了单台DSS服务器并发量可以上几百。 》DSS服务可以像承载点播一样,实现直播。 》支持多路直播,就跟增加一个点播文件一样简单。
缺点: 》延时一般需要5秒左右 》直播集群支持节点受限,一台PC运行Live555采集端可同时注入的DSS服务器数量不超过5台
首先需要修改DSS服务端配置: 这里需要设置一下/usr/local/movies/目录的QTSS访问权限,允许写入: 修改DSS配置,增加文件:vi /usr/local/movies/qtaccess,增加以下几行 require any-user require any-user
基本原理图如下: /—-【客户端 1 RTSP Client(例如VLC)】
【采集客户端调用Live555 DarwinInjector】 —-> 【DSS 服务器 192.168.1.22】《—–【客户端 2 RTSP Client(例如VLC)】
—-【客户端 N RTSP Client(例如VLC)】
方案的实现流程,用伪代码来说明:
调用live555中已有的类创建Darwin injector对象 DarwinInjector* injector = DarwinInjector::createNew(env, “teset.sdp”);
采集的音频流,编码为AAC格式
把采集到的音频流,加入injector对象(含有rtp和rtcp) //2.1. 得到音频流AAC的es流 FramedSource *audioSource = demuxSvr->NewElementaryStream(0, stream_id);
//2.2 创建音频流的rtp和rtcp Groupsock rtpGroupsockAudio(env, dummyDestAddress, 0, 0); Groupsock rtcpGroupsockAudio(env, dummyDestAddress, 0, 0); audioSink = MPEG4GenericRTPSink::createNew(env, &rtpGroupsockAudio, 97,//audio rtp payload 97 stream->sample_rate, “audio”, “AAC-hbr”, configstr, stream->channels );
RTCPInstance audioRTCP = RTCPInstance::createNew(env, &rtcpGroupsockAudio, estimatedSessionBandwidthAudio, CNAME, audioSink, NULL / were a server */);
//2.3 把音频流加入 Darwin injector: injector->addStream(audioSink, audioRTCP);
把采集到的视频流加入injecctor //3.1. 得到视频流H.264编码的es流 FramedSource videoEs = demuxSvr->NewElementaryStream(0, stream_id); H264VideoStreamFramer framer = H264VideoStreamFramer::createNew(env, videoEs); const char *sps = demuxSvr->GetLastDemux()->GetSPSString();//3.2 创建视频流的rtp和rtcp Groupsock rtpGroupsockVideo(env, dummyDestAddress, 0, 0); Groupsock rtcpGroupsockVideo(env, dummyDestAddress, 0, 0);
videoSink = H264VideoRTPSink::createNew(env, &rtpGroupsockVideo, 96, sps);
const unsigned estimatedSessionBandwidthVideo = 2500; // in kbps; for RTCP b/w share RTCPInstance videoRTCP = RTCPInstance::createNew(env, &rtcpGroupsockVideo, estimatedSessionBandwidthVideo, CNAME, videoSink, NULL / were a server */);
//3.3把视频流加入 Darwin injector: injector->addStream(videoSink, videoRTCP);
开始把实时音视频流注入DSS服务器//设置DSS服务器参数和节目名 if (!injector->setDestination(“192.168.1.22”, “test.sdp”, “test.sdp”, “LIVE555 Streaming Media”))) { env << “injector->setDestination() failed: ” env.reclaim(); return -1; }
//启动音视频流 status.videoSink->startPlaying(videoSource, afterPlaying, (void)&status); status.audioSink->startPlaying(audioSource, afterPlaying, (void)&status);
//启动Live555的任务循环 env.taskScheduler().doEventLoop(); // does not return
客户端访问DSS服务器节目,本例中的URL为: rtsp://192.168.1.22/test.sdp免责声明:文章内容来自互联网,本站不对其真实性负责,也不承担任何法律责任,如有侵权等情况,请与本站联系删除。
转载请注明出处:【转载】Live555 + Darwin Streaming Server(DSS)视频直播方案 https://www.yhzz.com.cn/a/14339.html