使用libmp4v2和OpenH264将h264复用到mp4

时间:2018-03-21 03:54:00

标签: c++ encoding mp4 openh264

我使用OpenH264作为编码器,我希望使用libmp4v2将其输出复用到可播放的mp4中

结果graph.db仅部分工作。它可以在VLCMPC-HC中播放,但不能在Windows Media Player和Windows 10“电影和电视”应用中播放。
我的目标是该文件适用于所有这些玩家。

两位Windows玩家都在告诉我他们不知道编解码器,所以他们无法播放: enter image description here
这不是真的,因为我可以使用cli中的FFmpeg使用相同的h264比特流播放手动复用的文件:

.mp4

根据这个知识,我认为我的编码过程工作正常,问题出在多路复用过程中。

修改 感谢Rudolfs Bundulis回答谁指出SPS / PPS数据丢失,我能够重构我的代码。它现在试图通过分析编码器比特流并在必要时调用ffmpeg -i "testenc.h264" -c:v copy -f mp4 "output.mp4" MP4AddH264SequenceParameterSet来包含丢失的数据。但仍然没有成功。

我的完整代码:

MP4AddH264PictureParameterSet

1 个答案:

答案 0 :(得分:1)

您可以使用GPAC中的MP4Box分析两个文件的MP4框布局。 enter image description here 如此处所示,坏文件缺少avcC框中的SPS / PPS数据。同样的NAL单元也很可能存储在NAL单元中,但是规范要求它们也存在于avcC框中(一些玩家在流中处理SPS / PPS,但这是一个不好的做法,因为它打破了寻求和什么不是因为您不知道哪个样本组引用了哪个参数预先设置。

对libmp4v2的快速谷歌搜索为我提供了example,其中显示了如何实际呼叫MP4AddH264SequenceParameterSet / MP4AddH264PictureParameterSet以提供SPS / PPS,而您只需拨打MP4WriteSample这可能是问题。

我的主观意见 - 我从未使用过libmp4v2但是如果你不知道如何使用它也只是使用ffmpeg - 更多的例子和社区将更大。将H.264复用到mp4非常简单,在互联网上又有很多例子。

<强>概要

  1. MP4要求SPS / PPS信息位于avcC框中 - 如果这些单元与样本内联,某些播放器可能能够对流进行解码,但为了符合规范,应始终使用将avcC框存在,否则玩家可以自由地播放该流。
  2. 根据所使用的库,可能有不同的技术如何将SPS / PPS发送到多路复用器,但如此处使用libmp4v2,必须使用P4AddH264SequenceParameterSet/MP4AddH264PictureParameterSet。要获得SPS / PPS数据,应该解析比特流。这取决于比特流格式(如果使用带有起始码的附件b格式或使用交错长度的avcc格式 - 请参阅this以获取更多信息)。提取SPS / PPS信息时,应将其传递给多路复用库。
  3. 小心处理SPS / PPS。规范实际上声明你可以有多个stsd流描述框,然后引用它们,但据我记得,Windows Media Player处理这个问题很糟糕,所以如果可能的话,坚持使用单个SPS / PPS集。应该能够将编码器配置为不在每个关键帧上发出重复的SPS / PPS条目。