【转载】Live555 + Darwin Streaming Server(DSS)视频直播方案

david 2020-10-17 18:27:28 5011

该方案的实现原理是,通过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)】

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

  1. 调用live555中已有的类创建Darwin injector对象
    DarwinInjector* injector = DarwinInjector::createNew(env, "teset.sdp");

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

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

//2.3 把音频流加入 'Darwin injector':
injector->addStream(audioSink, audioRTCP);

  1. 把采集到的视频流加入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);

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

  1. 客户端访问DSS服务器节目,本例中的URL为:
    rtsp://192.168.1.22/test.sdp
声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
david
红包 19 5 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
david
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区