Java mp4parser 片段序列不连续

Posted

技术标签:

【中文标题】Java mp4parser 片段序列不连续【英文标题】:Java mp4parser fragment sequence discontinuity 【发布时间】:2021-10-23 07:31:26 【问题描述】:

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

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

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


这个log 是 来自ChunkFragmentM4sBuilderTest.java 导致 串联的测试输出test-java-mp4parser.mp4 似乎 没事:

但是,当我使用 VLC 播放随附的播放列表和片段时,我在日志中看到这些失败:

mp4: Fragment sequence discontinuity detected 163497124 != 0

当 VLC 播放以下 DASH 播放列表时会发生此错误:

test5.mpd test5-128k-163497124.m4s test5-128k-163497125.m4s test5-128k-163497126.m4s test5-128k-IS.mp4

这是我的自定义片段构建器类的最新实现和附加说明:

Files.deleteIfExists(Path.of(m4sFilePath));
AACTrackImpl aacTrack=new AACTrackImpl(new FileDataSourceImpl(aacFilePath));
Movie movie=new Movie();
movie.addTrack(aacTrack);
Container mp4file=new ChunkFragmentM4sBuilder(seqNum).build(movie);
FileChannel fc=new FileOutputStream(m4sFilePath).getChannel();
mp4file.writeContainer(fc);
fc.close();
ChunkFragmentM4sBuilderTest.log.txt test5-128k-IS.mp4 test-java-mp4parser.mp4

【问题讨论】:

如果您认为这是一个糟糕的问题,我们非常感谢您提供反馈。 使用我的 tag-parser.java 对您的 test-java-mp4parser.mp4 进行一些挖掘后,我注意到该文件有 2 个重复的 ftyp 标签。规范说这个标签必须是一个且只有一个。第一个指定iso6mp41,另一个指定mp42, iso6, avc1isom,因为它是兼容品牌。使用ffmpeg 重新排列标签确实解决了问题:ffmpeg -i test-java-mp4parser.mp4 -acodec copy -vcodec copy output.mp4. @Darkman 那是因为该文件是用作测试的段的串联。问题在于那些根本不应该有ftypmoov,而只有styp 的段。 VLC 已经能够通过忽略额外的原子来播放 DASH 清单,只需提供正确的段列表。 @aergistal 没错。如果操作正确,那些m4ss 可以很容易地与其 init 文件连接。查看第一个test5-128k-163497124.m4s,它有ftyp 标签,这是不应该的,我不检查其他两个。我敢肯定他们也有一个。注意:一些MPEG-DASHs确实没有有一个初始化文件。 @Darkman 不,你不知道,它们只是自初始化的段。 【参考方案1】:

VLC 消息只是一个信息条目,而不是错误。这是预期的,因为起始序列号对应于实时边缘。

一旦 live-edge 超过了提供的这 3 个片段的最后一个片段的时间,您将无法播放该清单。您需要继续生成与当前时间相对应的新段。

您可以通过将清单设为静态、添加分段列表并修改起始编号来轻松测试。


您的段看起来是自初始化的,但没有这样声明,这会导致问题。它还浪费带宽,因为您已经提供了初始化段。

提醒一下,您应该:

带有ftypmoov 的初始化段 带有styp(可选)、moofmdat的一系列媒体片段

【讨论】:

不要忽视你的观点@aergistal 我相信你的专业知识!如上所述,我已经使用相同的播放列表文件播放了这两种类型的片段。一个在日志中没有错误,一个无法播放但显示错误。这使我相信文件中存在 一些 差异。我的逻辑有道理吗? 这将有助于发布完整的 VLC 调试日志和版本。尽管重复 moov 原子和不一致的基本解码时间等,但它在我结束时播放了您提供的片段重命名为当前时间 最终my third draft 构造了这个viable .m4s fragment @CharneyKaye 您可以修复的另一件事是tfdt 基本媒体解码时间,您的片段设置为 0,而不是自第一个片段(数字 0)以来所有先前样本的总和。 @CharneyKaye 完成后使其在测试服务器上可用并使用DASH-IF reference player 进行测试。

以上是关于Java mp4parser 片段序列不连续的主要内容,如果未能解决你的问题,请参考以下文章

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

Jackson xml反序列化不连续的内联数组

华为OD机试 -非严格递增连续数字序列(Java) | 机试题+算法思路+考点+代码解析 2023

LeetCode 128. 最长连续序列c++/java详细题解

最长回文子序列(不连续)以及最长回文子串(连续)

Leetcode 128 最长连续序列