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

从现有的非分段MP4文件创建初始文件

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

    我对较长的视频文件进行分块编码,将原始文件分割成单独编码的序列。这些序列是不同长度的文件,这取决于场景剪辑的位置,它们的长度可能在2到5秒之间。它们都是从一个工字架开始的,并且是独立的。

    我的编码序列都是MP4,例如:

    test_0000.mp4
    test_0001.mp4
    test_0002.mp4
    test_0003.mp4
    test_0004.mp4
    

    它们都有共同的属性:

    $ mp4info test_0000.mp4
    
    File:
      major brand:      isom
      minor version:    200
      compatible brand: isom
      compatible brand: iso2
      compatible brand: mp41
      fast start:       no
    
    Movie:
      duration:   2016 ms
      time scale: 1000
      fragments:  no
    
    ...
    

    现在,为了用短跑播放器玩这些游戏,我必须创建一个初始化段和单独的 fragmented MP4s .

    我可以通过 mp4fragment 我在每个独立的MP4文件上运行:

    $ mp4info test_0000.m4s
    File:
      major brand:      isom
      minor version:    200
      compatible brand: isom
      compatible brand: iso2
      compatible brand: mp41
      compatible brand: iso5
      fast start:       yes
    
    Movie:
      duration:   2016 ms
      time scale: 1000
      fragments:  yes
    
    ...
    

    但很明显,这些都不符合规范,而且都包含 moov 原子:

    我需要的是只有一个单独的媒体片段 moof mdat 框,然后需要一个只有 穆夫

    我如何从现有的、已经编码的片段中生成它?

    我知道这看起来像个XY问题。原则上,我已经可以在编码后直接分割原始文件,并同时运行这些编码,例如使用ffmpeg dash 但是,muxer或MP4Box:

    • 就最小和最大持续时间而言,几乎无法控制由此产生的分段大小
    • 这种方法不能并行化

    我还检查了便当;它似乎没有提供这种功能。FFmpeg也没有。MP4Box的行为类似。他们都假设你有一个长文件开始。


    我看我可以剪掉这个 ftyp 穆夫 为了创建一个初始化段,从这些假片段中删除一个框。但我最终会得到包含 倍数 驼鹿 mdat 盒子,这不是根据 the specification –它只允许一个片段和媒体数据框:

    4.媒体板块

    一个可选的片段类型框(styp),后跟一个电影片段框(moof),后跟一个或多个媒体数据框(mdat)。

    我想我可以接受这个 styp 不在场。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Daniel    7 年前

    我认为最简单的方法就是使用 MP4Box 看见 Split fragmented MP4 into multiple MP4 files 详细信息。