我对较长的视频文件进行分块编码,将原始文件分割成单独编码的序列。这些序列是不同长度的文件,这取决于场景剪辑的位置,它们的长度可能在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
不在场。