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