调试由 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
我正在编写创建 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