MP4 中的仿真防止字节
Emulation prevention bytes in MP4
H.264 定义两个零字节的序列应该通过在两个零字节后添加一个“3”字节来转义 ("Emulation prevention")。
这个转义规则是否也适用于 mp4 文件格式?
问题后面是调试ffmpeg的结果。我尝试打开以下文件:
https://www.dropbox.com/s/vrdy8z96pohh7ah/live_video_fragment_1.mp4?dl=0
VLC 播放但 ffmpeg 不播放。 ffmpeg 显示很多错误,第一个是(日志级别调试):
AVC: Consumed only 41 bytes instead of 796
调试到 ffmpeg 表明它尝试解析 H.264 解码器中的 moof 框,但在 https://github.com/FFmpeg/FFmpeg/blob/master/libavcodec/h264.c#L312
上失败
在解析 traf
框之前的 4 个字节(指示其大小)时,它会将“0 0 3”字节理解为防仿真字节,因此所有解析都会出现乱序。
那么,这是不是ffmpeg的错误行为(不应理解为防仿真)?或者文件包含错误,应该转义字节?
Is this escaping rule correct also for the mp4 file format?
对 MP4 中的 H264 内容启用了转义,但应该只对 MP4 容器内的 H264 部分启用转义。因此,鉴于 traf 框是 MP4 容器格式的一部分,而不是任何 H264 NAL 单元,它不应该被转义。我会用 FFmpeg 提交 bug。
H.264 定义两个零字节的序列应该通过在两个零字节后添加一个“3”字节来转义 ("Emulation prevention")。
这个转义规则是否也适用于 mp4 文件格式?
问题后面是调试ffmpeg的结果。我尝试打开以下文件:
https://www.dropbox.com/s/vrdy8z96pohh7ah/live_video_fragment_1.mp4?dl=0
VLC 播放但 ffmpeg 不播放。 ffmpeg 显示很多错误,第一个是(日志级别调试):
AVC: Consumed only 41 bytes instead of 796
调试到 ffmpeg 表明它尝试解析 H.264 解码器中的 moof 框,但在 https://github.com/FFmpeg/FFmpeg/blob/master/libavcodec/h264.c#L312
上失败在解析 traf
框之前的 4 个字节(指示其大小)时,它会将“0 0 3”字节理解为防仿真字节,因此所有解析都会出现乱序。
那么,这是不是ffmpeg的错误行为(不应理解为防仿真)?或者文件包含错误,应该转义字节?
Is this escaping rule correct also for the mp4 file format?
对 MP4 中的 H264 内容启用了转义,但应该只对 MP4 容器内的 H264 部分启用转义。因此,鉴于 traf 框是 MP4 容器格式的一部分,而不是任何 H264 NAL 单元,它不应该被转义。我会用 FFmpeg 提交 bug。