调试由 VLC 打开但不由 ffplay 打开的 MP4

Debugging an MP4 opened by VLC but not by ffplay

我正在编写创建 MP4 文件的代码。为了检查它,我创建了一个 MP4 文件。

VLC 和 Firefox 可以正确播放该文件,但 ffplay 或 Chrome 无法正确播放该文件。我猜该文件包含 VLC 可以处理的错误,但更激进的 MP4 reader 不能。

我考虑过修复文件并检查有什么不同来修复我的代码。但是我尝试了一些程序来修复MP4文件,直到现在都没有成功。

有人可以推荐另一种调试问题的方法,或者一个修复 MP4 文件的好工具吗?该文件是一个分段的 MP4,包含初始部分(ftyp、moov 框)和一个片段部分(moof 和空 sidx)。

这是视频文件:

https://www.dropbox.com/s/rojxzvkfxfj31u8/400k00001-3_serialized.mp4?dl=0

编辑:它在 Firefox 中也不起作用,当使用此示例中的媒体源扩展时: http://people.mozilla.org/~jyavenard/tests/mse_mp4/paper.html

(不要忘记在 Firefox 上启用 MSE,如下所述: http://www.linuxveda.com/2015/04/02/enable-mse-native-html5-support-firefox-linux/)

EDIT2:在 chrome://media-internals 中,我在上面的示例中看到以下错误: 追加:流解析失败。数据大小=131072append_window_start=0append_window_end=inf

(将 URL 更改为文件并将编解码器更改为 'avc1.4d401f' 而不是 'avc1.64000d,mp4a.40.2')。

最终通过修复文件中的一些错误解决了问题。 如果有人遇到类似问题,以下是修复方法:

  • MVHD 框中的持续时间应为零。
  • MEHD 框应包含在 MVEX 框内。 MEHD 框包含 fragment_duration 字段。
  • sample_flags(在 TREX 框中)6 个保留的 MSBit 应该是“1”而不是“0”。
  • TKHD 框中的音量字段应为 0 而不是 1(1 用于音频)。
  • TKHD 和 STSD 盒子的尺寸都错了。
  • avcC 框中的编解码器参数错误。与中的第三条评论完全相同的错误:. See this answer for correct parsing: html5 video tag codecs attribute
  • MFHD 包含 sequence_number 个零。应该从 1 开始。
  • TFDT 盒子不见了。应包含在 TRAF 框中并注明每个片段的 base_media_decode_time。
  • TRUN 缺少一个 data_offset 字段。导致FFMPEG认为数据是从MOOF框的开头开始的。
  • sample_flags 在 TRUN 框中是错误的。所有样本都标记为 "difference frame",没有关键帧开始...以下是对这些标志的解释:https://msdn.microsoft.com/en-us/library/ff469599.aspx