代码之家  ›  专栏  ›  技术社区  ›  stevendesu

在片段化MP4中的轨道运行是否必须从关键帧开始?

  •  2
  • stevendesu  · 技术社区  · 7 年前

    我正在摄取一个RTMP流,并将其转换为JavaScript中的一个片段MP4文件。这项工作花了一周时间,但我几乎完成了这项任务。我正在生成一个有效的 ftyp 原子 moov 原子,和 moof atom和视频的第一帧在进入无限缓冲区之前(与音频一起)实际播放,其中没有列出错误 chrome://media-internals

    ffprobe ,我得到一个类似以下的错误:

    [mov,mp4,m4a,3gp,3g2,mj2 @ 0x558559198080] Failed to add index entry
        Last message repeated 368 times
    [h264 @ 0x55855919b300] Invalid NAL unit size (-619501801 > 966).
    [h264 @ 0x55855919b300] Error splitting the input into NAL units.
    

    tfhd trun 驼鹿 原子

    然后,我将原始FLV文件转换为MP4格式 ffmpeg 使用以下命令:

    ffmpeg -i ~/Videos/rtmp/big_buck_bunny.flv -c copy -ss 5 -t 10 -movflags frag_keyframe+empty_moov+faststart test.mp4
    

    我打开了我正在创建的MP4和 ffmpeg 在atom解析文件中,并比较了以下两种情况:

    Comparing MP4 files with MP4A

    我首先想到的是 -生成的文件每个文件有多个视频样本 驼鹿 . 具体来说 从1个关键帧开始,然后包含所有差异帧,直到下一个关键帧(用作以下关键帧的开始) 原子)

    将此与我生成MP4的方式进行对比。我创建了一个 原子每一次一个FLV VIDEODATA 包裹到了。这意味着我的 驼鹿 可能不包含关键帧(通常不包含)

    这就是我遇到麻烦的原因吗?还是我还遗漏了什么?

    有关视频文件可在此处下载:

    我注意到的另一个问题是 ffmpeg 大量使用 base_data_offset tfhd 原子但是,当我尝试跟踪附加的总字节数并设置 基本数据偏移量 我自己,我在Chrome上犯了一个错误,大意是:“MSE不支持基本数据偏移”。根据ISO/IEC 14996-10规范:

    如果未提供,则电影片段中第一个曲目的基本数据偏移量是封闭的电影片段框的第一个字节的位置,对于第二个和后续的曲目片段,默认值是前面片段定义的数据的结尾。

    这句话让我相信 data_offset 首先 特鲁恩 原子应该等于原子的大小 驼鹿 原子与原子 第二 原子应该是 0 驼鹿 atom加上第一个磁道的总长度(就好像基偏移量是封闭磁道的第一个字节一样) 驼鹿 框,与第一个轨迹相同)

    1 回复  |  直到 7 年前
        1
  •  3
  •   szatmary    5 年前

    不,moof不需要从关键帧开始。您正在生成的文件产生无效的NALUs大小错误,因为它具有无效的nal大小。每个nal(在mdat中)必须在其前面加上大小。查看您的文件,mdat后的前4个字节是 0x21180C68 这太大了,不可能是一个有效的大小。