Java mp4parser 片段序列不连续

Java mp4parser fragment sequence discontinuity

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

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

例如,这里是自定义 ChunkFragmentM4sBuilder.java class.


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

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

mp4: Fragment sequence discontinuity detected 163497124 != 0

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

这里是我的自定义片段生成器的最新实现 class 和附加说明:

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();

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

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

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


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

提醒您应该:

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