ffmpeg - 使用 WebRTC/GetUserMedia 流作为 FFMPEG 的输入
问题描述
我正在使用 gerUserMedia 录制我的屏幕并获取我的视频和音频流。然后我使用 WebRTC 在另一台设备上发送/接收这个流。有什么方法可以通过某种方式转换这个传入的 webrtc 流作为 ffmpeg 的输入?
我正在使用的所有内容都在 javascript 中。
提前致谢。
解决方案
这些天(2020 年)这是一个相当普遍的要求,所以我会告诉你我对这个问题的看法:
首先,您遇到了两个不同多媒体域(WebRTC 和 ffmpeg)之间严重不兼容(编解码器和流协议)的完美示例。因此,要使它们互操作,您将需要一些棘手的技术和第三方软件。
ffmpeg 本身不能支持“WebRTC”,因为 WebRTC 不是完全定义的协议。WebRTC 的信令机制(交换 SDP 和候选冰)没有定义:它留给应用程序来实现。在 WebRTC 的第一步中,应用程序必须通过某种协议(通常是 websocket 或 http 请求)连接到信令服务器。因此,为了支持 WebRTC (RTCPeerConnection),ffmpeg 需要与一些 3-rd 方信令服务器进行互操作。另一种选择是在 ffmpeg 本身内部实现信令服务器,但是 ffmpeg 需要侦听某个端口,并且该端口需要在防火墙中打开(这就是信令服务器所做的)。对于 ffmpeg 来说,这并不是一个实际的想法。
因此,真正实用的解决方案是 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"
.
推荐阅读
- reactjs - 反应 - 无法读取未定义的属性'question_desc'
- python - 尝试使用 selenium python 获取下拉菜单的长度时元素不存在错误
- python - 当 QuerySet 为空时,如何找到 RelatedManager 管理的类?
- python - 为什么我的 for 循环实际上没有循环?我没有中断功能,并希望它循环但它没有
- c# - 生成 Swagger/Autorest API 客户端时出现语义冲突
- python - python中针对自定义异常的错误处理
- java - 在 IDEA 上运行教程项目“table-walkthrough”时遇到多个问题
- ios - iOS FBSDK 图形请求失败,“code”:100,“error_subcode”:facebook 响应中的 33
- javascript - 如果不在视口视图中,如何从 DOM 中隐藏元素
- salesforce - salesforce lwc - 有线适配器无法将跟踪变量声明为参数