Java mp4parser片段序列不连续性

2024-04-10

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

我创建这个公共 GitHub 项目 https://github.com/charneykaye/encode-fmp4-demo完整地重现该问题。

例如,这是自定义的ChunkFragmentM4sBuilder.java https://github.com/charneykaye/encode-fmp4-demo/blob/main/src/main/java/com/charneykaye/ChunkFragmentM4sBuilder.java class.


This log https://github.com/charneykaye/encode-fmp4-demo/blob/main/notes/via-java-mp4parser-v2/ChunkFragmentM4sBuilderTest.log.txt是 从ChunkFragmentM4sBuilderTest.java https://github.com/charneykaye/encode-fmp4-demo/blob/main/src/test/java/com/charneykaye/ChunkFragmentM4sBuilderTest.java这导致 连接的测试输出测试-java-mp4parser.mp4 https://github.com/charneykaye/encode-fmp4-demo/blob/main/notes/via-java-mp4parser-v2/test-java-mp4parser.mp4看来 没事:

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

mp4: Fragment sequence discontinuity detected 163497124 != 0

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

  • 测试5.mpd https://github.com/charneykaye/encode-fmp4-demo/blob/main/notes/via-java-mp4parser-v2/test5.mpd
  • 测试5-128k-163497124.m4s https://github.com/charneykaye/encode-fmp4-demo/blob/main/notes/via-java-mp4parser-v2/test5-128k-163497124.m4s
  • 测试5-128k-163497125.m4s https://github.com/charneykaye/encode-fmp4-demo/blob/main/notes/via-java-mp4parser-v2/test5-128k-163497125.m4s
  • 测试5-128k-163497126.m4s https://github.com/charneykaye/encode-fmp4-demo/blob/main/notes/via-java-mp4parser-v2/test5-128k-163497126.m4s
  • test5-128k-IS.mp4 https://github.com/charneykaye/encode-fmp4-demo/blob/main/notes/via-java-mp4parser-v2/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 https://github.com/charneykaye/encode-fmp4-demo/blob/main/notes/via-java-mp4parser-v2/ChunkFragmentM4sBuilderTest.log.txt
  • test5-128k-IS.mp4 https://github.com/charneykaye/encode-fmp4-demo/blob/main/notes/via-java-mp4parser-v2/test5-128k-IS.mp4
  • 测试-java-mp4parser.mp4 https://github.com/charneykaye/encode-fmp4-demo/blob/main/notes/via-java-mp4parser-v2/test-java-mp4parser.mp4

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

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

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


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

提醒一下您应该:

  • 一个 init 段ftyp and moov
  • 一系列媒体片段styp(选修的),moof, mdat
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java mp4parser片段序列不连续性 的相关文章

  • 使用 Intellij Idea 和 gradle 在应用程序引擎上调试 localhost

    我正在使用 IntelliJ 社区添加并使用 Gradle 构建应用程序引擎标准环境应用程序 在迁移到 IntelliJ 和端点框架之前 我使用的是 Android Studio 我无法调试我的本地主机 我添加了 jvmFlags 如下所述
  • java.lang.ClassNotFoundException:javax.mail.MessagingException

    我想使用 eclipse 将电子邮件从我的 gmail 帐户发送到另一个邮件帐户 我使用 apache tomcat 7 0 34 作为我的 Web 服务器 并使用端口 8080 作为 apache 服务器 HTTP 1 1 并使用 JRE
  • 两个整数乘积的模

    我必须找到c c a b mod m a b c m 是 32 位整数 但 a b 可以超过 32 位 我正在尝试找出一种计算 c 的方法 而不使用 long 或任何 gt 32 位的数据类型 有任何想法吗 如果m是质数 事情可以简化吗 注
  • 如何在 Java 中向时间戳添加/减去时区偏移量?

    我正在使用 JDK 8 并且玩过ZonedDateTime and Timestamp很多 但我仍然无法解决我面临的问题 假设我得到了格式化的Timestamp在格林威治标准时间 UTC 我的服务器位于某处 假设它设置为Asia Calcu
  • Android中如何使用JNI获取设备ID?

    我想从 c 获取 IMEIJNI 我使用下面的代码 但是遇到了未能获取的错误cls 它总是返回NULL 我检查了环境和上下文 它们都没有问题 为什么我不能得到Context班级 我在网上搜索了一下 有人说我们应该使用java lang Ob
  • Mockito 使用 @Mock 时将 Null 值注入到 Spring bean 中?

    由于我是 Spring Test MVC 的新手 我不明白这个问题 我从以下代码中获取了http markchensblog blogspot in search label Spring http markchensblog blogsp
  • Java 中如何将 char 转换为 int? [复制]

    这个问题在这里已经有答案了 我是Java编程新手 我有例如 char x 9 我需要得到撇号中的数字 即数字 9 本身 我尝试执行以下操作 char x 9 int y int x 但没有成功 那么我应该怎么做才能得到撇号中的数字呢 ASC
  • 如何在java中将日期格式从YYMMDD更改为YYYY-MM-DD? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我从机器可读代码中获取日期格式为 YYMMDD 如何将其更改为 YYYY MM DD 例如我收到 871223 YYMMDD 我想把它改成
  • Sun 在 EDT 之外做 GUI 工作的演示?

    我正在看SplashDemo java http download oracle com javase tutorial uiswing examples misc SplashDemoProject src misc SplashDemo
  • 如何在 ant 中为 junit 测试设置 file.encoding?

    我还没有完全完成file encoding 和 ant https stackoverflow com questions 1339352 how do i set dfile encoding within ants build xml
  • 如何在JPanel中设置背景图片

    你好 我使用 JPanel 作为我的框架的容器 然后我真的想在我的面板中使用背景图片 我真的需要帮助 这是我到目前为止的代码 这是更新 请检查这里是我的代码 import java awt import javax swing import
  • 使用 Elastic Beanstalk 进行 Logback

    我在使用 Elastic Beanstalk 记录应用程序日志时遇到问题 我正在 AWS Elastic Beanstalk 上的 Tomcat 8 5 with Corretto 11 running on 64bit Amazon Li
  • JDBC 时间戳和日期 GMT 问题

    我有一个 JDBC 日期列 如果我使用 getDate 则会得到 date 仅部分2009 年 10 月 2 日但如果我使用 getTimestamp 我会得到完整的 date 2009 年 10 月 2 日 13 56 78 890 这正
  • 不可变的最终变量应该始终是静态的吗? [复制]

    这个问题在这里已经有答案了 在java中 如果一个变量是不可变的并且是final的 那么它应该是一个静态类变量吗 我问这个问题是因为每次类的实例使用它时创建一个新对象似乎很浪费 因为无论如何它总是相同的 Example 每次调用方法时都会创
  • 如何区分从 Saxon XPathSelector 返回的属性节点和元素节点

    给定 XML
  • 轻松的反应

    我有一个与这里描述的类似的案例 动态更改RESTEasy服务返回类型 https stackoverflow com questions 3786781 dynamically change resteasy service return
  • Java Swing - 如何禁用 JPanel?

    我有一些JComponents on a JPanel我想在按下 开始 按钮时禁用所有这些组件 目前 我通过以下方式显式禁用所有组件 component1 setEnabled false 但是有什么办法可以一次性禁用所有组件吗 我尝试禁用
  • 手动设置Android Studio的JDK路径

    如何为 Android Studio 使用自定义 JDK 路径 我不想弄乱 PATH 因为我没有管理员权限 是否有某个配置设置文件允许我进行设置 如果您查看项目设置 您可以从那里访问 jdk 在标准 Windows 键盘映射上 您可以在项目
  • Java RMI - 客户端超时

    我正在使用 Java RMI 构建分布式系统 它必须支持服务器丢失 如果我的客户端使用 RMI 连接到服务器 如果该服务器出现故障 例如电缆问题 我的客户端应该会收到异常 以便它可以连接到其他服务器 但是当服务器出现故障时 我的客户端什么也
  • Java 和/C++ 在多线程方面的差异

    我读过一些提示 多线程实现很大程度上取决于您正在使用的目标操作系统 操作系统最终提供了多线程能力 比如Linux有POSIX标准实现 而windows32有另一种方式 但我想知道编程语言水平的主要不同 C似乎为同步提供了更多选择 例如互斥锁

随机推荐