首页 > 解决方案 > 使用 WebRTC/GetUserMedia 流作为 FFMPEG 的输入

问题描述

我正在使用 gerUserMedia 录制我的屏幕并获取我的视频和音频流。然后我使用 WebRTC 在另一台设备上发送/接收这个流。有什么方法可以通过某种方式转换这个传入的 webrtc 流作为 ffmpeg 的输入?

我正在使用的所有内容都在 javascript 中。

提前致谢。

标签: ffmpegwebrtcgetusermedia

解决方案


这些天(2020 年)这是一个相当普遍的要求,所以我会告诉你我对这个问题的看法:

首先,您遇到了两个不同多媒体域(WebRTC 和 ffmpeg)之间严重不兼容(编解码器和流协议)的完美示例。因此,要使它们互操作,您将需要一些棘手的技术和第三方软件。

  1. ffmpeg 本身不能支持“WebRTC”,因为 WebRTC 不是完全定义的协议。WebRTC 的信令机制(交换 SDP 和候选冰)没有定义:它留给应用程序来实现。在 WebRTC 的第一步中,应用程序必须通过某种协议(通常是 websocket 或 http 请求)连接到信令服务器。因此,为了支持 WebRTC (RTCPeerConnection),ffmpeg 需要与一些 3-rd 方信令服务器进行互操作。另一种选择是在 ffmpeg 本身内部实现信令服务器,但是 ffmpeg 需要侦听某个端口,并且该端口需要在防火墙中打开(这就是信令服务器所做的)。对于 ffmpeg 来说,这并不是一个实际的想法。

  2. 因此,真正实用的解决方案是 ffmpeg 从某个第三方 WebRTC 网关/服务器接收流。您的网页通过 WebRTC 发布到该网关/服务器,然后 ffmpeg 从中提取一个流。

    一个。如果您的 WebRTC 网页编码 H264 视频 + Opus 音频,那么您的生活相对容易。您可以安装 Wowza 或 Unreal Media Server 并通过 WebRTC 将流发布到这些服务器。然后在 Wowza/Unreal 中启动该流的 MPEG2-TS 广播,并使用 ffmpeg 接收该 MPEG2-TS 流。任务完成,并且没有对流进行任何转码/解码,只是transmuxing(从WebRTC中使用的RTP容器解包,并打包到MPEG2-TS容器),这是非常消耗CPU的事情。

    湾。当您需要在 WebRTC 发布网页中使用 VP8/VP9 编解码器时,真正的“美”来了。您不能执行上一段中建议的过程,因为 ffmpeg 不支持可以承载 VP8/VP9 编码视频的流协议。在 Windows 操作系统上仍然可以为 ffmpeg 完成任务,但是以一种非常尴尬的方式:使用 Unreal 的两个 DirectShow 源过滤器:WebRTC 源过滤器和 Video Mixer 源过滤器。您不能单独使用 WebRTC 源过滤器,因为 ffmpeg 无法接收来自 DirectShow 源过滤器的压缩视频(这是 ffmpeg 的一大缺陷)。因此:配置 Video Mixer 源过滤器以从 WebRTC 源过滤器获取视频(反过来,它将从 Unreal Media Server 接收您发布的流)。Video Mixer 源过滤器将流解压缩为 RGB24 视频和 PCM 音频。然后ffmpeg可以使用ffmpeg -f dshow -i video="Unreal Video Mixer Source".


推荐阅读