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 播放列表时发生此错误:
- test5.mpd
- test5-128k-163497124.m4s
- test5-128k-163497125.m4s
- test5-128k-163497126.m4s
- test5-128k-IS.mp4
这里是我的自定义片段生成器的最新实现 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 个中的最后一个片段的时间,您将无法播放该清单。您将需要继续生成与当前时间相对应的新段。
您可以通过将清单设为静态、添加段列表并修改起始编号来轻松地进行测试。
您的段看起来是自初始化的,但并未如此声明,这会导致问题。它还会浪费带宽,因为您已经提供了初始化段。
提醒您应该:
- 具有
ftyp
和 moov
的初始段
- 具有
styp
(可选)、moof
、mdat
的一系列媒体片段
此用例是一项服务,可将一系列未压缩的 .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 播放列表时发生此错误:
- test5.mpd
- test5-128k-163497124.m4s
- test5-128k-163497125.m4s
- test5-128k-163497126.m4s
- test5-128k-IS.mp4
这里是我的自定义片段生成器的最新实现 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 个中的最后一个片段的时间,您将无法播放该清单。您将需要继续生成与当前时间相对应的新段。
您可以通过将清单设为静态、添加段列表并修改起始编号来轻松地进行测试。
您的段看起来是自初始化的,但并未如此声明,这会导致问题。它还会浪费带宽,因为您已经提供了初始化段。
提醒您应该:
- 具有
ftyp
和moov
的初始段
- 具有
styp
(可选)、moof
、mdat
的一系列媒体片段