当前位置: 首页 > 知识库问答 >
问题:

Java mp4parser创建单个。m4S片段-无效moov框

严亮
2023-03-14

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

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

例如,下面是自定义的CustomFragmentMP4Builder.java类。

至关重要的是,我们能够用序列号(索引)来指定这个单个的。m4S片段,我们将为每个媒体段手动递增序列号(索引)。

目标是构建一个.m4S片段,该片段包含框类型SegmentTypeBoxSegmentIndexBoxMovieFragmentBox。作为参考,我使用mp4parser检查了通过FFMPEG-F HLS生成的。m4S片段。此规范在这里以。yaml文件的形式提供

我的实现创建了一个MP4没有错误。但是,当单元测试试图读取ChunkMp4Builder刚刚写入到临时文件夹的文件时:

java.lang.RuntimeException: A cast to int has gone wrong. Please contact the mp4parser discussion group (3724673092)
    at org.mp4parser.tools.CastUtils.l2i(CastUtils.java:30)
    at org.mp4parser.support.AbstractBox.parse(AbstractBox.java:97)
    at org.mp4parser.AbstractBoxParser.parseBox(AbstractBoxParser.java:116)
    at org.mp4parser.BasicContainer.initContainer(BasicContainer.java:107)
    at org.mp4parser.IsoFile.<init>(IsoFile.java:57)
    at org.mp4parser.IsoFile.<init>(IsoFile.java:52)
    at com.charneykaye.TestBase.getMp4Boxes(TestBase.java:116)
    at com.charneykaye.CustomFragmentMp4BuilderTest.run(CustomFragmentMp4BuilderTest.java:78)

但是,在文件的末尾会出现一个未知类型的框:

共有1个答案

柴飞星
2023-03-14

由于MDAT原子大小不正确,您的M4S段无效。

例如,在test5-128k-151304042.m4s中,mdat标记为长度为16字节,但末尾有数据,文件大小为164884。

然后,解析器尝试读取无效的偏移量。avc5不是原子,而是字符串“lavc58.54.100”的一部分。读取为3724673100的长度也无效,并且大于32位整数的最大值,因此转换为int无效。

ParsableBox moov = createMovieFragmentBox(movie);
isoFile.addBox(moov);
List<SampleSizeBox> stszs = Path.getPaths(moov, "trak/mdia/minf/stbl/stsz");
// ...

protected MovieFragmentBox createMovieFragmentBox(Movie movie) {
    MovieFragmentBox mfb = new MovieFragmentBox();
    // ...
}

这不是moov原子,而是moof。其中没有STSZ,样本大小的总和为0,因此MDAT的计算总大小为16+0。

moov应该在初始化段中。

 类似资料:
  • 此用例是一项服务,它手动将一系列未压缩的. wav媒体段编码为. m4s片段以通过MPEG-DASH广播,使用ffmpeg将. wav压缩为. aac和sannies/mp4parser将aac音频组装成. m4s媒体片段。 我创建了这个公共GitHub项目来完整地再现该问题。 例如,这是自定义的ChunkFragmentM4sBuilder.java类。 此日志来自ChunkFragmentM4

  • 此时,Frag2在堆栈上,是唯一可见的片段。我使用了replace和addToBackStack,因为我需要后退导航。我的问题是,当我在Frag2内旋转屏幕时,活动中的super.oncreate(savedInstanceState)方法调用frag1的构造函数。 在用户按下后退按钮之前,有没有什么方法可以避免调用Frag1的构造函数?

  • YQL(简化): 结果(简化): 如何告诉Vespa从“计算机”而不是“de”创建代码段?

  • 我想写一个为我创建多个片段的方法,但我不知道如何做到这一点。几次尝试之后,我变得更加困惑。 这是我通常如何创建两个片段 创建片段的第二次调用 由于newInstance方法是静态的,我似乎不知道如何创建一个泛型方法并只传入类类型。另外,传入newInstance的对象并不总是数组。以下是我的尝试:

  • MainActivity(扩展了fragmentActivity)有listview,它调用listviewadapter,其中有一个带有ViewpagerAdapter的ViewPager。现在,如果我需要在ViewPager中生成5个片段,如何将getFragmentManager()传递给适配器。 MainActivity[fragmentActivity]---->Listview----

  • 我使用FragmentActivity在片段之间切换。但我希望在片段上有一个管理按钮,当我单击它时,一个新的片段或活动看起来像一个孩子(在操作栏中有后退按钮)。 我怎样才能做到? 这是我的代码,可以使用,但“后退”按钮不会出现在操作栏中: 片段: 活动(目前……但如果需要,可能会出现碎片?): 也许我必须更改舱单中的某些内容?