Java mp4解析器片段序列不连续

2022-05-31 00:00:00 mp4 mpeg-dash java mp4parser fmp4

此使用案例是一项服务,它手动将一系列未压缩的.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播放以下短划线播放列表时发生此错误:

  • 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

vlc

推荐答案消息只是一个信息条目,不是错误。这是预期的,因为起始序列号对应于活动边缘。

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

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


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

提醒您:

  • 包含ftypmoov的初始化段
  • 一系列styp(可选)、moofmdat

相关文章