RTMP流媒体服务端应用开发系列 – Nginx-Rtmp分离音视频流

开一个RTMP 流媒体服务端开发系列的坑,主要用到Rtmp-Nginx, Linux平台。

需求:推流端发布后,播放端只希望拉取播放纯音频或视频流。

分析:这种需求可能是为了效仿映客直播分离音视频流来播放的方法。从抓包来看,映客使用http-flv的CDN加速直播流,形如
http://pull.a8.com/live/1458696839457751.flv?only-video=1
http://pull.a8.com/live/1458696839457751.flv?only-audio=1
有什么好处? 不确定,估计播放端网络卡时,可以断开视频流但保持码率不大的音频流,体验较好。 还有一种可能是方便做纯音频类应用,播放端只想听到音频,虽然可以不解码视频,但是视频的数据也不想拉下来,节省移动数据流量。

思路:使用Nginx-Rtmp的exec来调用ffmpeg,在服务端分离rtmp流。

实现:

Rtmp-NGinx 开了3个application
第一个live,所有上传流对到这个app,然后做了exec指令,调用ffmpeg来转每一路进来的流,客户端推流就推到这个app上来。
-c:v copy -an 拷贝视频流但不包含音频流 转推到 onlyvideo 这个app去, 流名称不变
-c:a copy -vn 拷贝音频流但不包含视频流 转推到 onlyaudio 这个app去, 流名称不变
onlyaudio和onlyvideo两个app也设置为直播类型,但只允许从本地网络推流。

当要播放完整流 就连接:rtmp://serverip/live/stream_name
当要播放纯视频流 就连接:rtmp://serverip/onlyvideo/stream_name
当要播放纯音频流 就连接:rtmp://serverip/onlyaudio/stream_name

后记:部分服务端如CentOS,ffmpeg的版本较老:0.8.x ,不支持-c:v copy,-c:a copy ,只能用-vcodec copy 和 -acodec copy ,请注意修改。

另外,Flash Media Server 是支持flash客户端设置netStream.receiveAudio(true),netStream.receiveVideo(false)这样的API,发出AMF Command来控制fms只发送音频或视频数据,如果你的服务端使用FMS,可以去实现这个指令。或者你自己开发的服务端,支持这个指令。

QQ20160323-0

Hex:
QQ20160323-1

 

原创文章,转载请注明: 转载自贝壳博客

本文链接地址: RTMP流媒体服务端应用开发系列 – Nginx-Rtmp分离音视频流

2 评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据