【问题标题】:Emulation prevention bytes in MP4MP4 中的仿真预防字节
【发布时间】:2015-07-26 03:38:30
【问题描述】:

H.264 定义应通过在两个零字节后添加一个“3”字节来转义两个零字节的序列(“模拟预防”)。

此转义规则是否也适用于 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 的错误行为吗(不应将其理解为防止仿真)?或者文件包含错误并且字节应该被转义?

【问题讨论】:

    标签: video ffmpeg mp4 h.264 libavcodec


    【解决方案1】:

    这个转义规则是否也适用于 mp4 文件格式?

    为 MP4 中的 H264 内容启用转义,但它应该只对 MP4 容器内的 H264 部分启用。因此,鉴于 traf 框是 MP4 容器格式的一部分,而不是任何 H264 NAL 单元,它不应该被转义。我会用 FFmpeg 提交bug

    【讨论】:

    • 谢谢。我仍然不确定这是一个 ffmpeg 错误,也许该文件包含错误。出于某种原因,ffmpeg 认为样本数据从 MOOF 框的开头开始,我猜该文件只是缺少片段数据的起始偏移量的值。还在检查。如果您还可以告诉我哪个框应该包含此起始偏移量,那将非常有帮助。谢谢!
    • 其实我想我发现了错误。 TRUN 框缺少一个 data_offset 值,因此从 MOOF 框开始,data_offset 被认为为零。
    猜你喜欢
    • 1970-01-01
    • 2017-08-04
    • 2022-01-21
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 2021-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多