0

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

我创建了这个公共 GitHub 项目来完整地重现这个问题。

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


日志来自ChunkFragmentM4sBuilderTest.java导致串联的测试输出test-java-mp4parser.mp4似乎没问题:

串联的 init .mp4 和片段 .m4s 都可以

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

mp4: Fragment sequence discontinuity detected 163497124 != 0

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

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

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

1 回答 1

0

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

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

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


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

提醒一下,您应该拥有:

  • ftyp一个带有和的初始化段moov
  • 一系列带有styp(可选)的媒体片段moofmdat
于 2021-10-23T15:20:01.673 回答