开一个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流。
实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
rtmp { server { listen 1935; application live { live on; exec ffmpeg -re -i rtmp://127.0.0.1/$app/$name -c:a copy -vn -f flv rtmp://127.0.0.1/onlyaudio/$name; exec ffmpeg -re -i rtmp://127.0.0.1/$app/$name -c:v copy -an -f flv rtmp://127.0.0.1/onlyvideo/$name; } application onlyaudio { live on; # publish only from localhost allow publish 127.0.0.1; deny publish all; } application onlyvideo { live on; # publish only from localhost allow publish 127.0.0.1; deny publish all; } } } |
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,可以去实现这个指令。或者你自己开发的服务端,支持这个指令。
Hex:
原创文章,转载请注明: 转载自贝壳博客
不错,不错,看看了!
看看!