【问题标题】:VP8/VP9 RTP libraryVP8/VP9 RTP 库
【发布时间】:2013-07-04 20:00:14
【问题描述】:

是否有任何现有的库可以促进通过 RTP 传输 VP8/VP9 流?

我找到了 VP8 (https://datatracker.ietf.org/doc/html/draft-ietf-payload-vp8-08) 的 RFC 草案,但没有提及 VP9 编解码器(太新了?)。 似乎 libavformat 实现了这个草案。有人有其他选择吗?

【问题讨论】:

  • 您在寻找webmproject.org/code 吗?注意 RTP 只是传输协议,找到你想要的任何 RTP 库。
  • 我所说的 RTP 库是指 VP8/9 有效负载的实现,而不是 RTP 本身(例如帧的分区/分段)
  • 那叫编解码器,官方/原厂vp8/9编解码器在我给你的链接里
  • 编解码器的输出是有效负载。 RTP 和 rtp 库不关心负载中的内容。取一段来自编解码器的数据,并将其放入 RTP 的有效负载中,按照该特定编解码器的建议大小(或您通过其他方式协商的内容,例如 SIP)。在接收时执行相反的操作,选择 RTP 有效负载,通过编解码器运行它,将编解码器的输出写入声卡。
  • @nos 这不正确:某些有效负载格式具有交错、聚合和分片等特性。在这些情况下,RTP 有效负载格式指定了将数据打包成 RTP 数据包所需的处理,以及反向处理以便将输出传递给解码器。

标签: rtp vp8 libvpx


【解决方案1】:

从 GStreamer 1.8.2 开始(可能更旧,但 1.8.2 或更高版本会让您的生活更轻松),这一切都可以使用 GStreamer 本身来完成。你应该忽略 ffmpeg 和 libav(同样的东西——项目有一个分裂)交叉插件。

您将需要 gstreamer、gst-plugins-base、gst-plugins-good 和 gst-plugins-bad 的源代码,仅此而已。不要使用 gst-plugins-ffmpeg、libav 等,此时所有这些建议都已过时。 (对于 h.264/h.265,您可能仍然需要它,但那又是一团糟。)您还应该获取 libvpx 的源代码,最好是 1.6.0 版。熟悉并熟悉从 automake 构建这些项目。 GStreamer 尤其具有非常干净的配置脚本;学习如何有效地使用它们。

重要的是不要混用 0.10 系列和 1.8.2 系列代码,因为 VP8 的 RFC 在此期间已获得批准(就像 Opus 一样,如果您将其用于音频,我推荐的),并且一些在 SDP 文件中使用的魔术字符串已经改变。

但是,您应该注意,仍然存在一些松散的结局。

特别是,如果您使用 SDP 文件来驱动所有这些东西,请注意使用“sdpdemux”自动生成图形仍然有一些限制。一方面,库存 sdpdemux 没有“等级”,因此不会自动处理类型“application/sdp”。您应该期望构建一个自定义应用程序来构建您的图表 - 这个过程有一些学习曲线。

您应该对插件的分支副本和调整它们持开放态度,因为这通常会增加很多灵活性而无需付出太多努力,但请注意,复制的插件需要大量更改令牌名称以避免冲突与现有插件一起使用,并且必须小心操作以确保插件仍然有效。

我建议您彻底熟悉以下 GStreamer 组件:

vp8dec vp8enc vp8parse(注意:见下文) matroskamux matroskademux 队列 rtpbin rtpjitterbuffer sdpdemux udpsink udpsrc 视频转换

...以及至少一种现代音频编解码器的匹配材料(我推荐 Opus,因此,“opusdec”和“opusenc”)。

请注意上面的“vp8parse”。这可从“kotaku”项目中获得,您可能需要也可能不需要它。如果您想在粒度级别处理 vp8 视频——在没有实际解码的情况下跳过它,等等——你可能需要它。某些类型的非线性编辑应用程序肯定需要这个。从 GST 1.8.2 开始,它尚未合并到主线 GStreamer 代码库中。

作为保持理智的一个特殊点,不要在不了解您要进入的内容的情况下通过 RTP 使用 VORBIS 进行音频流式传输。 Vorbis 和 Theora 使用“动态码本”——依赖于内容的压缩字典,这些字典随被压缩的材料而变化。这意味着解码器神奇地需要知道编码器想出什么作为码本,但是您没有文件头,因为您正在流式传输。有一些方法可以解决这个问题,但它们并不令人愉快。如果您尝试将其塞入 SDP 文件以便在远程端恢复,我建议您确定一种您可以在数量上容忍的低成本苏格兰威士忌。

还有一些其他问题需要警惕。

如果您希望在硬件加速的嵌入式系统上进行解码,请不要使用任何“花哨的”压缩设置,除非您拥有非常完整的 QA 资源供您使用。并非所有技术上有效的流都会在所有硬件加速解码器中解码。特别是,“弹性”选项非常诱人且非常有效,但会破坏 IMX6 目标的加速解码。

如果没有非常重大的妥协,VP8 编码就无法实时进行。可能需要一些时间来了解这些是什么以及它们是如何工作的。进入这个问题超出了这个问题的范围,除了当你实际上只是没有足够快地将数据发送到你的 udpsink 时你很容易认为你的发射器坏了的问题。别担心,它可以做到,但你需要做你的研究。首先查看 libvpx 的“截止日期”选项。

最后,我强烈建议您查看 RTP 中的 VP8、RTP、VP8 有效负载的 RFC,特别是 SDP 中的 RTCP(R-T-C-P,不是 RTP,不是 TCP)、SDP、VP8 流。这些特定问题中的每一个都有几个 RFC。请确保您查看的是当前版本,而不是草稿!发生了一些非常重大的变化。

当您熟悉您的规格和工具时,您会意识到我现在将为您总结的三点:

  1. 您不能使用 gst-launch 完成所有操作,但如果可以,它可以节省大量时间。

  2. 您可以使用自定义应用程序做任何事情,但学习曲线很长,开发时间也很长。

  3. 许多编写官方 RFC 的人只测试了他们所写材料的非常狭窄的用例,尤其是多媒体。

祝你好运!

【讨论】:

    【解决方案2】:

    Mediastreamer2 可以为您做到这一点。用于支持VP8的Linphone。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-04
      • 1970-01-01
      • 2016-06-02
      • 1970-01-01
      • 2020-11-23
      • 2016-10-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多