我使用OpenH264作为编码器,我希望使用libmp4v2将其输出复用到可播放的mp4中
结果graph.db
仅部分工作。它可以在VLC和MPC-HC中播放,但不能在Windows Media Player和Windows 10“电影和电视”应用中播放。
我的目标是该文件适用于所有这些玩家。
两位Windows玩家都在告诉我他们不知道编解码器,所以他们无法播放:
这不是真的,因为我可以使用cli中的FFmpeg使用相同的h264比特流播放手动复用的文件:
.mp4
根据这个知识,我认为我的编码过程工作正常,问题出在多路复用过程中。
修改
感谢Rudolfs Bundulis回答谁指出SPS / PPS数据丢失,我能够重构我的代码。它现在试图通过分析编码器比特流并在必要时调用ffmpeg -i "testenc.h264" -c:v copy -f mp4 "output.mp4"
或MP4AddH264SequenceParameterSet
来包含丢失的数据。但仍然没有成功。
我的完整代码:
MP4AddH264PictureParameterSet
答案 0 :(得分:1)
您可以使用GPAC中的MP4Box分析两个文件的MP4框布局。 如此处所示,坏文件缺少avcC框中的SPS / PPS数据。同样的NAL单元也很可能存储在NAL单元中,但是规范要求它们也存在于avcC框中(一些玩家在流中处理SPS / PPS,但这是一个不好的做法,因为它打破了寻求和什么不是因为您不知道哪个样本组引用了哪个参数预先设置。
对libmp4v2的快速谷歌搜索为我提供了example,其中显示了如何实际呼叫MP4AddH264SequenceParameterSet
/ MP4AddH264PictureParameterSet
以提供SPS / PPS,而您只需拨打MP4WriteSample
这可能是问题。
我的主观意见 - 我从未使用过libmp4v2但是如果你不知道如何使用它也只是使用ffmpeg - 更多的例子和社区将更大。将H.264复用到mp4非常简单,在互联网上又有很多例子。
<强>概要强>
avcC
框中 - 如果这些单元与样本内联,某些播放器可能能够对流进行解码,但为了符合规范,应始终使用将avcC
框存在,否则玩家可以自由地播放该流。P4AddH264SequenceParameterSet/MP4AddH264PictureParameterSet
。要获得SPS / PPS数据,应该解析比特流。这取决于比特流格式(如果使用带有起始码的附件b格式或使用交错长度的avcc格式 - 请参阅this以获取更多信息)。提取SPS / PPS信息时,应将其传递给多路复用库。stsd
流描述框,然后引用它们,但据我记得,Windows Media Player处理这个问题很糟糕,所以如果可能的话,坚持使用单个SPS / PPS集。应该能够将编码器配置为不在每个关键帧上发出重复的SPS / PPS条目。