【问题标题】:Parsing VP8/OPUS frames解析 VP8/OPUS 帧
【发布时间】:2015-08-31 07:27:48
【问题描述】:

我正在使用 C 语言在 Linux 环境中开发一个 webrtc 模拟器。在这里,我需要将媒体从一个 webrtc 模拟器发送到另一个 webrtc 模拟器。我需要使用 VP8 和 Opus 编解码器。现在我开始使用 VP8 编解码器。由于我是VP8的新手,请帮助我了解更多。

  1. 由于是模拟器,我不想实时捕获/播放媒体。我需要从文件中读取音频/视频数据并将其发送到远程。在远程获取提取的媒体数据,将其保存到文件中。

  2. 哪种文件格式包含编码的 VP8 数据?是webm文件格式还是别的什么?

  3. 假设 webm 文件包含 VP8 和 OPUS 编解码器数据(我不确定),我如何逐帧解析。例如,如果我阅读Extract audio frames from AMR-NB file,我可以从文件中解析 amr 帧。同样是否有任何帮助页面,我在其中学习 VP 框架的解析逻辑。

  4. 或者是否有任何开源使用,我可以从 webm 文件中解析 VP8/OPUS 帧。

【问题讨论】:

  • 是的,它是 webM。看看这个webmproject.org/code
  • 迈克尔,感谢您的意见。我检查了 libwebm。它的可执行文件很少,例如 sample、sample_muxer、dumpvtt。我应该遵循哪一个,是我需要检查和理解的sample.cpp。看起来 sample.cpp 解释了 Matroska 解析器。但我正在寻找 VP8 / Opus 解析器。 Matroska 如何与 VP8 和 OPUS 相关联。请告诉我。

标签: webrtc vp8 opus


【解决方案1】:

第二季度: 我先从第2题开始,VP8对应WebM格式。

第三季度: 如果要逐帧解析,需要知道VP8和OPUS的结构。 我不知道模拟在您的场景中意味着什么,但在 WebRTC 环境中,媒体数据是通过 RTP 传输的。如果你是在没有RTP的情况下进行模拟,请从第2步开始,否则从第1步开始。

  1. 从 RTP 数据包中解包 RTP 有效负载。 RTP 负载包含 VP8 数据包信息,如序列号、时间戳等。
  2. 注意,VP8 帧可能由多个 VP8 数据包组成,所以基本上你需要提取帧内容并将其连接在一起。有多种方法可以确定帧是否由多个数据包组成,并非所有数据包都完全标准化,但现在我建议您使用序列号,因为一帧的数据包共享相同的 SEQ。
  3. 将帧写入文件。如果要创建有效的 WebM 文件,请使用 LibAV(我个人使用)中的 av_write_frame() 等函数。

我可以向您推荐一段将原始 RTP VP8 数据包实际转换为 VP8 帧的代码:https://github.com/meetecho/janus-gateway/blob/master/postprocessing/pp-webm.c。 包头读取用于函数(预处理和处理)。

第四季度: 我将 LibAV 用于此类目的(或者 FFMPEG)。

我很乐意回答任何其他问题。

【讨论】:

  • 谢谢。我将使用 RTP。我的情况类似于从simulator1 调用simulator2。 Simulator1 将读取一个 webm 文件,获取音频和视频数据并发送到 Simulator 2。所以首先我需要读取一个 webm 文件,解析 VP8 或 OPUS 帧,发送到 Simulator 2。获取 VP8/OPUS 数据的 Simulator2 将写入文件。我假设 webm 文件包含 vp8 和 opus 编码数据(不是原始数据)。所以我可以从 webm 文件中读取 vp8 和 opus 编码数据并将其发送到simulator2。有没有我可以参考的示例代码。在将数据写入文件时,上面的链接将在模拟器 2 端有用。
  • 对于阅读我会使用 av_read_frame,我找到了这个例子。您的源当然是 WebM 文件,而不是实时流 (RTSP)。 hasanaga.info/tag/ffmpeg-libavcodec-av_read_frame-example
  • 这个例子看起来好多了:ffmpeg.org/doxygen/2.1/doc_2examples_2demuxing_8c-example.html 你应该感兴趣的是 av_read_frame 和 av_decode_video2 函数。
  • 首先构建 libav-10.7,然后构建 ffmpeg.org/doxygen/2.1/doc_2examples_2demuxing_8c-example.html 中给出的源代码。有一些链接错误(对于 av_get_media_type_string()、av_ts2timestr(),知道为什么会这样..)。由于这些是在 printf/fprintf 中使用的,所以我只是评论了这些行并成功构建。下载了一个示例 webm 文件 (vp8/vorbis) 并能够生成原始音频和视频文件。执行期间的日志显示使用 ffplay 播放原始音频。我在哪里可以获得 ffplay(适用于 Ubuntu)。请告诉我。
  • 这是东西,前段时间 LibAV 和 FFMPEG 分叉了。你可以在这里阅读:stackoverflow.com/questions/9477115/…。对于 LibAV,有 avplay,对于 FFMPEG,有 ffplay。你使用 FFMPEG 还是 LibAV?
猜你喜欢
  • 2015-09-11
  • 1970-01-01
  • 2017-11-02
  • 1970-01-01
  • 1970-01-01
  • 2016-05-18
  • 1970-01-01
  • 1970-01-01
  • 2014-03-04
相关资源
最近更新 更多