解析VP8/OPUS帧

3

我正在使用C语言在Linux环境下开发webrtc模拟器。在这里,我需要从一个webrtc模拟器向另一个模拟器发送媒体。我需要使用VP8和Opus编解码器。现在我要开始使用VP8编解码器。由于我对VP8不熟悉,请帮助我更好地理解。

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

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

  3. 假设webm文件包含VP8和OPUS编解码器数据(我不确定),我该如何逐帧解析。例如,如果我读取从AMR-NB文件中提取音频帧,我可以从文件中解析出amr帧。同样,是否有任何帮助页面,我可以学习VP帧的解析逻辑。

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


1
是的,它是WebM格式。 请查看此链接:http://www.webmproject.org/code/ - Michael P
Michael,感谢您的建议。我查看了libwebm。它有一些可执行文件,如sample、sample_muxer、dumpvtt。我应该遵循哪一个,是sample.cpp吗?看起来sample.cpp解释了Matroska解析器。但我正在寻找VP8 / Opus解析器。Matroska与VP8和OPUS有什么关系?请告诉我。 - Austin
1个回答

4

问题2:VP8对应WebM格式。

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

  1. 从RTP数据包中拆分出RTP payload。 RTP payload 包含 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 。 函数(preprocess 和 process)中使用的是数据包头读取。

问题4:我使用 LibAV(或 FFMPEG)进行此类操作。

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


您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Austin
这个例子看起来好多了:https://ffmpeg.org/doxygen/2.1/doc_2examples_2demuxing_8c-example.html 对你来说可能比较有趣的是 av_read_frame 和 av_decode_video2 函数。 - golstar
这是件事,LibAV和FFMPEG在一段时间前分叉了。你可以在这里阅读更多信息:https://dev59.com/EWox5IYBdhLWcg3wCQAq。对于LibAV,有avplay;而对于FFMPEG,则有ffplay。你使用的是FFMPEG还是LibAV? - golstar
算法应该是相似的,因为它们来自同一个基础。然而,我相信LibAV被支持作为Ubuntu官方软件包是有原因的。这仍然很主观,因为我使用LibAV。 - golstar
你好,我在 http://stackoverflow.com/questions/31040600/webm-vp8-opus-file-read-and-write-back 上有一个更明确的问题(与此略有不同),您能否检查并指导我。 - Austin
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接