我正在对更长的视频文件进行分块编码,在这里我将原始文件分成了单独编码的各个序列。这些序列是不同长度的文件,具体取决于场景剪辑出现的位置-它们的长度可能在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
原子:
我需要的是只有一个moof
和mdat
框的单个媒体段,然后它们需要只有一个moov
框的初始化段。
如何从现有的,已编码的细分中生成该信息?
我知道这看起来像XY问题。原则上,我可以在编码后直接对原始文件进行分段,然后同时运行这些编码,例如使用ffmpeg的dash
混合器或MP4Box,
我也检查了Bento4;它似乎不提供此功能。 FFmpeg也没有。 MP4Box的行为类似。他们都假设您有一个长文件开始。
我看到我可以从这些“假片段”中分离出ftyp
和moov
框,以创建一个初始化段。但我最终会看到包含 multiple moof
和mdat
框的段,这与the specification并不相同–它只允许一个片段和媒体数据框:
4。媒体细分
[…]一个可选的“段类型框”(样式),然后是一个“电影片段”框(“ moof”),然后是一个或多个“媒体数据框”(mdat)。
我想我可以忍受styp
不存在。