转载请注明出处:https://blog.csdn.net/impingo
项目地址:https://github.com/im-pingo/pingos
ffmpeg和mediasoup怎么配合
最近在使用mediasoup做WebRTC服务器,个人认为mediasoup做sfu还是非常有好的,相对于其他功能丰富的WebRTC服务器来说mediasoup代码更简单,功能简单更有针对性。
项目现在面临着WebRTC服务器间回源的需求,我计划给mediasoup扩展一个rtsp协议,用作机器间回源。同时方便转码和录制集群拉流。
为了验证ffmpeg是否能够很好地兼容WebRTC服务器提供的rtp流
(为什么要考虑ffmpeg?因为虽然我刚入职这家公司,我闭着眼睛也能猜到转码集群一定是用ffmpeg做的,接口最好是支持ffmpeg标准输入),
我利用mediasoup的PlainRTPTransport模块做了如下实验:
- ffmpeg推opus文件流
- ffmpeg拉取rtp直播流
不再废话,先上ffmpeg和sdp。
ffmpeg推opus文件流
想要推流到mediasoup服务器,需要如下操作:
-
发送信令router.createPlainRtpTransport,在mediasoup上创建接收端口(例如开放端口28022),同时携带ffmpeg开放的localrtpport和localrtcpport,作用是创建传输peer对。
-
再发送信令router.createProducer,创建producer处理收上来的流。
-
通过ffmpeg推流,注意ssrc 和 payload_type要与上述步骤“2”中保持一致。
#
#
# ffmpeg -re -f mp3 -i z3.mp3 -acodec libopus -ab 128k -ac 2 -ar 48000 -ssrc 3333 -payload_type 111 -f rtp "rtp://192.168.189.104:28022?rtcp=28022&localrtpport=20413&localrtcpport=20414"
#
#
- 192.168.189.104 WebRTC服务器IP。
- 28022 WebRTC服务器为收取这路流做开放的端口,rtcp=28022表示rtcp协议复用rtp的端口传输。
- localrtpport 和 localrtcpport 是指定ffmpeg在本地开放的udp端口。
除此之外,其余参数相当于SDP
v=0
o=- 0 0 IN IP4 127.0.0.1
s=No Name
c=IN IP4 192.168.189.104
t=0 0
a=tool:libavformat 58.26.101
m=audio 28022 RTP/AVP 111
b=AS:128
a=rtpmap:111 opus/48000/2
a=fmtp:111 sprop-stereo=1
ffmpeg拉取rtp流
想要从mediasoup服务器拉流,需要如下操作:
- 发送信令router.createPlainRtpTransport
- 发送router.createConsumer
- 通过ffmpeg拉流
- 拉取VP8视频:
SDP文件内容
v=0
o=urtc-client 1552531492341837152 2 IN IP4 0.0.0.0
s=-
c=IN IP4 192.168.189.104
t=0 0
m=video 20513 RTP/SAVPF 96 97
a=rtpmap:96 VP8/90000
a=rtpmap:97 rtx/90000
a=fmtp:97 apt=96
a=rtcp-fb:96 goog-remb
a=rtcp-fb:96 nack
a=rtcp-fb:96 ccm fir
a=rtcp-fb:96 nack pli
a=extmap:2 urn:ietf:params:rtp-hdrext:toffset
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a\=extmap:9 urn:ietf:params:rtp-hdrext:sdes:mid
a=extmap:4 urn:3gpp:video-orientation
a=setup:active
a=mid:1
a=sendrecv
#
#
# ffmpeg -thread_queue_size 10240 -protocol_whitelist "file,udp,rtp" -i v.sdp -vcodec copy -y output2.webm
#
#
- 拉取opus音频:
SDP文件内容
v=0
o=- 0 0 IN IP4 127.0.0.1
s=No Name
c=IN IP4 192.168.189.104
t=0 0
a=tool:libavformat 58.26.101
m=audio 21996 RTP/AVP 111
b=AS:128
a=rtpmap:111 opus/48000/2
a=fmtp:111 sprop-stereo=1
#
#
# ffmpeg -max_delay 5000 -reorder_queue_size 16384 -protocol_whitelist file,udp,rtp -i a.sdp -acodec aac -y output.aac
#
#
结论
通过以上操作,可以将一路流通过ffmpeg推送到mediasoup,也可以用ffmpeg通过dump下一路rtp流,如果mediasoup支持rtsp协议,ffmpeg和其他支持标准rtsp协议的工具都可以方便地dump到WebRTC直播中的内容。
岂不美哉?