从现有的未分段的分段MP4文件创建一个Init文件

时间:2018-10-31 13:34:31

标签: ffmpeg media mp4 mpeg-dash media-source

我正在对更长的视频文件进行分块编码,在这里我将原始文件分成了单独编码的各个序列。这些序列是不同长度的文件,具体取决于场景剪辑出现的位置-它们的长度可能在2到5秒之间。它们都以I帧开头,并且是独立的。

我编码的序列都是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

...

现在,为了使用DASH播放器进行播放,我必须创建一个初始化段和一个单独的fragmented MP4s

我可以通过运行在每个独立MP4文件上的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原子:

我需要的是只有一个moofmdat框的单个媒体段,然后它们需要只有一个moov框的初始化段。

如何从现有的,已编码的细分中生成该信息?

我知道这看起来像XY问题。原则上,我可以在编码后直接对原始文件进行分段,然后同时运行这些编码,例如使用ffmpeg的dash混合器或MP4Box,

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

我也检查了Bento4;它似乎不提供此功能。 FFmpeg也没有。 MP4Box的行为类似。他们都假设您有一个长文件开始。


我看到我可以从这些“假片段”中分离出ftypmoov框,以创建一个初始化段。但我最终会看到包含 multiple moofmdat框的段,这与the specification并不相同–它只允许一个片段和媒体数据框:

  

4。媒体细分

     

[…]一个可选的“段类型框”(样式),然后是一个“电影片段”框(“ moof”),然后是一个或多个“媒体数据框”(mdat)。

我想我可以忍受styp不存在。

1 个答案:

答案 0 :(得分:0)

我认为最简单的方法是使用MP4Box,有关详细信息,请参见Split fragmented MP4 into multiple MP4 files