Java mp4parser输出为空

编程入门 行业动态 更新时间:2024-10-11 07:27:28
本文介绍了Java mp4parser输出为空的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

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

我创建了this public GitHub project以完整复制该问题。

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

使用MP4盒的第一个示例可以工作,因为我能够生成一个初始化的MP4+系列片段M4 然后可以串联这些文件以形成可播放的MPEG4流。

注意:此用例要求从单独生成的源段对每个媒体段进行编码,而不是使用MP4Box等工具从连续的音频源进行流媒体。

通过mp4parser手动构建媒体段的尝试总体上仍然失败,因为由 下面使用的ChunkFragmentM4sBuilder.java格式不正确。 但我很难理解它们到底是如何畸形的。

将两个测试日志并排比较对我很有帮助 侧面,ChunkFragmentM4sBuilderTest.log.txt 和MP4BoxTest.log.txt。

通过Java mp4parser(格式错误) 前者log是 来自ChunkFragmentM4sBuilderTest.java,其结果是 中的串联测试输出test-java-mp4parser.mp4 事实为空:

Files.deleteIfExists(Path.of(m4sFilePath)); AACTrackImpl aacTrack=new AACTrackImpl(new FileDataSourceImpl(aacFilePath)); Movie movie=new Movie(); movie.addTrack(aacTrack); Container mp4file=new ChunkFragmentM4sBuilder(hz,seconds,seqNum,bufferSize).build(movie); FileChannel fc=new FileOutputStream(m4sFilePath).getChannel(); mp4file.writeContainer(fc); fc.close();
  • test5.mpd
  • test5-128k-163493804.m4s
  • test5-128k-163493805.m4s
  • test5-128k-163493806.m4s
  • test5-128k-IS.mp4

串联框:

FileTypeBox[majorBrand=iso5;minorVersion=512;compatibleBrand=iso6;compatibleBrand=mp41] MovieBox[MovieHeaderBox[creationTime=Thu Dec 31 16:00:00 PST 1903;modificationTime=Thu Dec 31 16:00:00 PST 1903;timescale=1000;duration=0;rate=1.0;volume=1.0;matrix=Rotate 0°;nextTrackId=2];TrackBox[TrackHeaderBox[creationTime=Thu Dec 31 16:00:00 PST 1903;modificationTime=Thu Dec 31 16:00:00 PST 1903;trackId=1;duration=0;layer=0;alternateGroup=1;volume=1.0;matrix=Rotate 0°;width=0.0;height=0.0];EditBox[EditListBox{entries=[Entry{segmentDuration=0, mediaTime=1024, mediaRate=1.0}]}];MediaBox[MediaHeaderBox[creationTime=Thu Dec 31 16:00:00 PST 1903;modificationTime=Thu Dec 31 16:00:00 PST 1903;timescale=48000;duration=0;language=und];HandlerBox[handlerType=soun;name=SoundHandler];MediaInformationBox[SoundMediaHeaderBox[balance=0.0];DataInformationBox[DataReferenceBox[DataEntryUrlBox[]]];SampleTableBox[SampleDescriptionBox[AudioSampleEntry{bytesPerSample=0, bytesPerFrame=0, bytesPerPacket=0, samplesPerPacket=0, packetSize=0, compressionId=0, soundVersion=0, sampleRate=48000, sampleSize=16, channelCount=2, boxes=[org.mp4parser.boxes.iso14496.part14.ESDescriptorBox@bed094d2]}];TimeToSampleBox[entryCount=0];SampleToChunkBox[entryCount=0];SampleSizeBox[sampleSize=0;sampleCount=0];StaticChunkOffsetBox[entryCount=0]]]]];MovieExtendsBox[org.mp4parser.boxes.iso14496.part12.TrackExtendsBox@11e7301d];UserDataBox[MetaBox[HandlerBox[handlerType=mdir;name=];AppleItemListBox[org.mp4parser.boxes.apple.AppleEncoderBox@691fba4]]]] SegmentTypeBox[majorBrand=msdh;minorVersion=0;compatibleBrand=msdh;compatibleBrand=msix] SegmentIndexBox{entries=[Entry{referenceType=0, referencedSize=160944, subsegmentDuration=480000, startsWithSap=1, sapType=0, sapDeltaTime=0}], referenceId=1, timeScale=48000, earliestPresentationTime=0, firstOffset=0, reserved=0} MovieFragmentBox[MovieFragmentHeaderBox{sequenceNumber=151304042};TrackFragmentBox[TrackFragmentHeaderBox{trackId=1, baseDataOffset=-1, sampleDescriptionIndex=0, defaultSampleDuration=-1, defaultSampleSize=-1, defaultSampleFlags=null, durationIsEmpty=true, defaultBaseIsMoof=true};TrackFragmentBaseMediaDecodeTimeBox{baseMediaDecodeTime=0};TrackRunBox{sampleCount=470, dataOffset=-1, dataOffsetPresent=false, sampleSizePresent=true, sampleDurationPresent=true, sampleFlagsPresentPresent=false, sampleCompositionTimeOffsetPresent=false, firstSampleFlags=null}]] org.mp4parser.boxes.iso14496.part12.MediaDataBox@3969adb0 通过MP4Box(Ok) 后者log是 从MP4BoxTest.java产生串联的测试输出 test-mp4box.mp4可以。

注意,此方法对于最终用例是不可接受的,因为此hack方法输出的块中存在缺陷。

MP4Box -profile live -add aacFilePath -dash 10000 -frag 10000 -idx ${NUM} -moof-sn ${NUM} -out test5.mpd -segment-name test5-128k- -segment-ext m4s -single-traf -subsegs-per-sidx 0 -daisy-chain -single-segment /tmp
  • test5.mpd
  • test5-128k-163494320.m4s
  • test5-128k-163494321.m4s
  • test5-128k-163494322.m4s
  • test5-128k-IS.mp4

串联框:

FileTypeBox[majorBrand=iso5;minorVersion=512;compatibleBrand=iso6;compatibleBrand=mp41] MovieBox[MovieHeaderBox[creationTime=Thu Dec 31 16:00:00 PST 1903;modificationTime=Thu Dec 31 16:00:00 PST 1903;timescale=1000;duration=0;rate=1.0;volume=1.0;matrix=Rotate 0°;nextTrackId=2];TrackBox[TrackHeaderBox[creationTime=Thu Dec 31 16:00:00 PST 1903;modificationTime=Thu Dec 31 16:00:00 PST 1903;trackId=1;duration=0;layer=0;alternateGroup=1;volume=1.0;matrix=Rotate 0°;width=0.0;height=0.0];EditBox[EditListBox{entries=[Entry{segmentDuration=0, mediaTime=1024, mediaRate=1.0}]}];MediaBox[MediaHeaderBox[creationTime=Thu Dec 31 16:00:00 PST 1903;modificationTime=Thu Dec 31 16:00:00 PST 1903;timescale=48000;duration=0;language=und];HandlerBox[handlerType=soun;name=SoundHandler];MediaInformationBox[SoundMediaHeaderBox[balance=0.0];DataInformationBox[DataReferenceBox[DataEntryUrlBox[]]];SampleTableBox[SampleDescriptionBox[AudioSampleEntry{bytesPerSample=0, bytesPerFrame=0, bytesPerPacket=0, samplesPerPacket=0, packetSize=0, compressionId=0, soundVersion=0, sampleRate=48000, sampleSize=16, channelCount=2, boxes=[org.mp4parser.boxes.iso14496.part14.ESDescriptorBox@bed094d2]}];TimeToSampleBox[entryCount=0];SampleToChunkBox[entryCount=0];SampleSizeBox[sampleSize=0;sampleCount=0];StaticChunkOffsetBox[entryCount=0]]]]];MovieExtendsBox[org.mp4parser.boxes.iso14496.part12.TrackExtendsBox@7ce1e496];UserDataBox[MetaBox[HandlerBox[handlerType=mdir;name=];AppleItemListBox[org.mp4parser.boxes.apple.AppleEncoderBox@51da5351]]]] SegmentTypeBox[majorBrand=msdh;minorVersion=0;compatibleBrand=msdh;compatibleBrand=msix] SegmentIndexBox{entries=[Entry{referenceType=0, referencedSize=162267, subsegmentDuration=479232, startsWithSap=1, sapType=1, sapDeltaTime=0}], referenceId=1, timeScale=48000, earliestPresentationTime=0, firstOffset=0, reserved=0} MovieFragmentBox[MovieFragmentHeaderBox{sequenceNumber=151304042};TrackFragmentBox[TrackFragmentHeaderBox{trackId=1, baseDataOffset=-1, sampleDescriptionIndex=0, defaultSampleDuration=-1, defaultSampleSize=-1, defaultSampleFlags=null, durationIsEmpty=false, defaultBaseIsMoof=true};TrackFragmentBaseMediaDecodeTimeBox{baseMediaDecodeTime=0};TrackRunBox{sampleCount=468, dataOffset=1964, dataOffsetPresent=true, sampleSizePresent=true, sampleDurationPresent=false, sampleFlagsPresentPresent=false, sampleCompositionTimeOffsetPresent=false, firstSampleFlags=null}]] org.mp4parser.boxes.iso14496.part12.MediaDataBox@640d3ba5 推荐答案

test-java-mp4parser.mp4不为空,但无效,原因是:

  • sidx条目引用大小错误
  • tfhd正在使用0覆盖默认的样本说明索引(1)
  • trun未指定数据偏移量
  • mdatAAC数据以8个零字节开始,导致解码失败

如果FFmpeg已修复,则使用FFmpeg播放文件。

列出的m4s段的格式也不正确,似乎与串联结果不一致。例如,序列号用作样本描述索引。

更多推荐

Java mp4parser输出为空

本文发布于:2023-10-28 00:01:55,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1534914.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:为空   Java   mp4parser

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!