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
标签。规范说这个标签必须是一个且只有一个。第一个指定iso6
和mp41
,另一个指定mp42, iso6, avc1
和isom
,因为它是兼容品牌。使用ffmpeg
重新排列标签确实解决了问题:ffmpeg -i test-java-mp4parser.mp4 -acodec copy -vcodec copy output.mp4
.
@Darkman 那是因为该文件是用作测试的段的串联。问题在于那些根本不应该有ftyp
和moov
,而只有styp
的段。 VLC 已经能够通过忽略额外的原子来播放 DASH 清单,只需提供正确的段列表。
@aergistal 没错。如果操作正确,那些m4s
s 可以很容易地与其 init 文件连接。查看第一个test5-128k-163497124.m4s
,它有ftyp
标签,这是不应该的,我不检查其他两个。我敢肯定他们也有一个。注意:一些MPEG-DASH
s确实没有有一个初始化文件。
@Darkman 不,你不知道,它们只是自初始化的段。
【参考方案1】:
VLC 消息只是一个信息条目,而不是错误。这是预期的,因为起始序列号对应于实时边缘。
一旦 live-edge 超过了提供的这 3 个片段的最后一个片段的时间,您将无法播放该清单。您需要继续生成与当前时间相对应的新段。
您可以通过将清单设为静态、添加分段列表并修改起始编号来轻松测试。
您的段看起来是自初始化的,但没有这样声明,这会导致问题。它还浪费带宽,因为您已经提供了初始化段。
提醒一下,您应该:
带有ftyp
和moov
的初始化段
带有styp
(可选)、moof
、mdat
的一系列媒体片段
【讨论】:
不要忽视你的观点@aergistal 我相信你的专业知识!如上所述,我已经使用相同的播放列表文件播放了这两种类型的片段。一个在日志中没有错误,一个无法播放但显示错误。这使我相信文件中存在 一些 差异。我的逻辑有道理吗? 这将有助于发布完整的 VLC 调试日志和版本。尽管重复moov
原子和不一致的基本解码时间等,但它在我结束时播放了您提供的片段重命名为当前时间
最终my third draft 构造了这个viable .m4s fragment
@CharneyKaye 您可以修复的另一件事是tfdt
基本媒体解码时间,您的片段设置为 0,而不是自第一个片段(数字 0)以来所有先前样本的总和。
@CharneyKaye 完成后使其在测试服务器上可用并使用DASH-IF reference player 进行测试。以上是关于Java mp4parser 片段序列不连续的主要内容,如果未能解决你的问题,请参考以下文章
用于创建单个 .m4s 片段的 Java mp4parser — 无效的 moov 框
华为OD机试 -非严格递增连续数字序列(Java) | 机试题+算法思路+考点+代码解析 2023