如何在服务器上使用 ffmpeg 从 WebRTC 流中获取音频和视频

Posted

技术标签:

【中文标题】如何在服务器上使用 ffmpeg 从 WebRTC 流中获取音频和视频【英文标题】:How to get the audio and video from a WebRTC stream using ffmpeg on server 【发布时间】:2015-01-26 01:48:36 【问题描述】:

我正在尝试从 WebRTC 流中获取音频和视频,并在 ubuntu 服务器上使用 ffmpeg 对其进行处理(转码或转储)。我天真地期望它只是解释 WebRTC 提供的 sdp,但结果是错误的。我怀疑 ffmpeg 无法发回答案 sdp 并且必须手动完成。这是一个offer sdp:

v=0
o=Mozilla-SIPUA-33.1 3662 0 IN IP4 0.0.0.0
s=SIP Call
t=0 0
a=ice-ufrag:5e0a74d1
a=ice-pwd:7446c0eb445117d0018ca2afc5f3ca54
a=fingerprint:sha-256 76:1B:19:CE:3F:41:C5:4D:64:E6:FD:72:D2:FC:42:E1:98:D4:0F:2B:73:AE:C7:F4:2C:73:2C:E7:9E:DC:6A:EB
m=audio 23063 RTP/SAVPF 109 0 8 101
c=IN IP4 188.253.146.208
a=rtpmap:109 opus/48000/2
a=ptime:20
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15
a=sendrecv
a=extmap:1 urn:ietf:params:rtp-hdrext:s-s-rc-audio-level
a=setup:actpass
a=candidate:0 1 UDP 2128609535 192.168.1.100 4130 typ host
a=candidate:1 1 UDP 1692467199 188.253.146.208 23063 typ srflx raddr 192.168.1.100 rport 4130
a=candidate:0 2 UDP 2128609534 192.168.1.100 4131 typ host
a=candidate:1 2 UDP 1692467198 188.253.146.208 23064 typ srflx raddr 192.168.1.100 rport 4131
a=rtcp-mux
m=video 23065 RTP/SAVPF 120 126 97
c=IN IP4 188.253.146.208
a=rtpmap:120 VP8/90000
a=rtpmap:126 H264/90000
a=fmtp:126 profile-level-id=42e01f;packetization-mode=1
a=rtpmap:97 H264/90000
a=fmtp:97 profile-level-id=42e01f
a=sendrecv
a=rtcp-fb:120 nack
a=rtcp-fb:120 nack pli
a=rtcp-fb:120 ccm fir
a=rtcp-fb:126 nack
a=rtcp-fb:126 nack pli
a=rtcp-fb:126 ccm fir
a=rtcp-fb:97 nack
a=rtcp-fb:97 nack pli
a=rtcp-fb:97 ccm fir
a=setup:actpass
a=candidate:0 1 UDP 2128609535 192.168.1.100 4132 typ host
a=candidate:1 1 UDP 1692467199 188.253.146.208 23065 typ srflx raddr 192.168.1.100 rport 4132
a=candidate:0 2 UDP 2128609534 192.168.1.100 4133 typ host
a=candidate:1 2 UDP 1692467198 188.253.146.208 23066 typ srflx raddr 192.168.1.100 rport 4133
a=rtcp-mux

有人成功了吗?谢谢。

【问题讨论】:

您将需要某种网关来处理 webrtc 设置,因为除了交换 SDP 之外还有更多步骤。 我明白了。不管需要什么,我都准备好输入 ffmpeg CLI 参数,然后手动提出报价。我只需要证明ffmpeg接收WebRTC流的概念。 我知道的唯一方法是使用网关进行所有对话,然后通过管道将 rtp 发送到您的 FFMpeg 命令将监听的 UDP 端口。我已经用Janus-gateway 和gstreamer 的libav 元素成功地做到了这一点。因此,使用 FFMPeg 将是一个类似的过程并且应该可以工作。 【参考方案1】:

在流源(对等)和 ffmpeg 之间没有“东西”是不可能的;直到和除非 ffmpeg 开始使用 DTLS 并且您知道对等方的哈希信息(显然这可能在 SDP 中)。所以总而言之,ffmpeg 需要 DTLS 和 ICE 支持。另一种方法是将 GStreamer 与插件一起使用。

【讨论】:

以上是关于如何在服务器上使用 ffmpeg 从 WebRTC 流中获取音频和视频的主要内容,如果未能解决你的问题,请参考以下文章

WebRTC 视频编解码类型的选择 VP8 H264 还是其他?(openh264编码,ffmpeg解码)

如何获取 webrtc 特定版本 源码

ffmpeg 和 SDL 的区别和联系? 谢谢

2022年音视频面试题 C/C++/Linux/FFmpeg/webRTC/rtmp/hls/rtsp/ffplay/srs

查看 janus webrtc 视频流时出现问题

从 webrtc 会话中提取视频流并转换为 rtmp