用于创建单个 .m4s 片段的 Java mp4parser — 无效的 moov 框

Posted

技术标签:

【中文标题】用于创建单个 .m4s 片段的 Java mp4parser — 无效的 moov 框【英文标题】:Java mp4parser to create a single .m4s fragment— invalid moov box 【发布时间】:2021-10-19 06:23:17 【问题描述】:

此用例是一项服务,它手动将一系列未压缩的 .wav 媒体片段编码为 .m4s 片段,以便通过 MPEG-DASH 广播,使用 ffmpeg 将 .wav 压缩为 .aac 和 sannies/mp4parser 将 aac 音频组装成 .m4s 媒体片段。

我创建了this public GitHub project 来完整重现该问题。

例如,这是自定义的 CustomFragmentMp4Builder.java 类。

我们能够指定这个带有序列号(索引)的单个 .m4s 片段至关重要,我们将为每个媒体片段手动递增。

目标是构建一个 .m4s 片段,其中包含框类型 SegmentTypeBoxSegmentIndexBoxMovieFragmentBox。作为参考,我使用 mp4parser 来检查通过 ffmpeg -f hls 生成的 .m4s 片段。此规范可用here as a .yaml file

我的实现创建了一个没有错误的 MP4。但是,当单元测试尝试读取 ChunkMp4Builder 刚刚写入临时文件夹的文件时:

java.lang.RuntimeException: A cast to int has gone wrong. Please contact the mp4parser discussion group (3724673092)
    at org.mp4parser.tools.CastUtils.l2i(CastUtils.java:30)
    at org.mp4parser.support.AbstractBox.parse(AbstractBox.java:97)
    at org.mp4parser.AbstractBoxParser.parseBox(AbstractBoxParser.java:116)
    at org.mp4parser.BasicContainer.initContainer(BasicContainer.java:107)
    at org.mp4parser.IsoFile.<init>(IsoFile.java:57)
    at org.mp4parser.IsoFile.<init>(IsoFile.java:52)
    at com.charneykaye.TestBase.getMp4Boxes(TestBase.java:116)
    at com.charneykaye.CustomFragmentMp4BuilderTest.run(CustomFragmentMp4BuilderTest.java:78)

预期的框类型 SegmentTypeBoxSegmentIndexBoxMovieFragmentBox 确实出现在输出中:

但是,文件末尾出现了一个未知类型的框:

【问题讨论】:

【参考方案1】:

由于mdat 原子大小不正确,您的 m4s 段无效。

例如在test5-128k-151304042.m4s 中,mdat 被标记为长度为 16 字节,但末尾有数据,文件大小为 164884。

然后解析器尝试读取无效的偏移量。 avc5 不是原子,而是字符串“Lavc58.54.100”的一部分。读取为 3724673100 的长度也是无效的,并且大于 32 位整数的最大值,因此无效转换为 int。


在您的实施中,您有:

ParsableBox moov = createMovieFragmentBox(movie);
isoFile.addBox(moov);
List<SampleSizeBox> stszs = Path.getPaths(moov, "trak/mdia/minf/stbl/stsz");
// ...

protected MovieFragmentBox createMovieFragmentBox(Movie movie) 
    MovieFragmentBox mfb = new MovieFragmentBox();
    // ...

这不是moov 原子,而是moof。那里没有stsz,并且您的样本大小总和为0,因此mdat 的总计算大小为16 + 0。

moov 应该在初始化段中。

【讨论】:

感谢您抽出宝贵时间调查此问题!当我稍后回到办公桌时,我会深入研究这个问题并可能会接受这个答案。 @CharneyKaye 一目了然:fMP4 完美!谢谢@aergistal github.com/charneykaye/encode-fmp4-demo/pull/1 然而,传奇还在继续! ***.com/questions/69684510/… 然后继续...***.com/questions/69686039/…

以上是关于用于创建单个 .m4s 片段的 Java mp4parser — 无效的 moov 框的主要内容,如果未能解决你的问题,请参考以下文章

当用户寻找另一个时间时,计算 HTML5 视频流中的 .m4s 段文件后缀

ffmpeg 将 m4s 转换为 mp4

如何获取 .mp4 视频文件的 Dash 片段

如何使用多个 NavHost 片段创建深层链接

如何在ViewPager中渲染单个片段?

使用单个片段显示UI而不是活动是一种好习惯吗?