您的位置:首页 > 其它

Live555 + Darwin Streaming Server(DSS)视频直播方案

2015-12-21 10:24 309 查看
该方案的实现原理是,通过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)】

方案的实现流程,用伪代码来说明:

0. 调用live555中已有的类创建Darwin injector对象

DarwinInjector* injector = DarwinInjector::createNew(env, "teset.sdp");

1. 采集的音频流,编码为AAC格式

2. 把采集到的音频流,加入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", config_str_,

stream->channels );

RTCPInstance* audioRTCP = RTCPInstance::createNew(env, &rtcpGroupsockAudio,

estimatedSessionBandwidthAudio, CNAME,

audioSink, NULL /* we're a server */);

//2.3 把音频流加入 'Darwin injector':

injector->addStream(audioSink, audioRTCP);

3. 把采集到的视频流加入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 /* we're a server */);

//3.3把视频流加入 'Darwin injector':

injector->addStream(videoSink, videoRTCP);

4. 开始把实时音视频流注入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

5. 客户端访问DSS服务器节目,本例中的URL为:

rtsp://192.168.1.22/test.sdp

转载自:http://www.mworkbox.com/wp/work/441.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: