如何使用ffmpeg向mediasoup推送文件并且使用ffmpeg录像webrtc

转载请注明出处:https://blog.csdn.net/impingo
项目地址:https://github.com/im-pingo/pingos

目录

  • ffmpeg和mediasoup怎么配合
    • ffmpeg推opus文件流
    • ffmpeg拉取rtp流
    • 结论
  • QQ交流群:697773082

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服务器,需要如下操作:

  1. 发送信令router.createPlainRtpTransport,在mediasoup上创建接收端口(例如开放端口28022),同时携带ffmpeg开放的localrtpport和localrtcpport,作用是创建传输peer对。

  2. 再发送信令router.createProducer,创建producer处理收上来的流。

  3. 通过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服务器拉流,需要如下操作:

  1. 发送信令router.createPlainRtpTransport
  2. 发送router.createConsumer
  3. 通过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直播中的内容。
岂不美哉?

QQ交流群:697773082

你可能感兴趣的:(webrtc)