从多个音频文件包中提取MediaExtractor

问题描述

我正在尝试使用MediaExtractor和MediaCodec播放打包在单个文件中的AAC(m4a)。

文件结构是这样的……

HEADER

track1.m4a

track2.m4a

等...

标题包含在其下方压缩的音频文件的偏移量和长度。

我正在尝试为这些单个文件创建MediaExtractors,如下所示:

Pack

当我只是从资产加载m4a文件并使用afd.getStartOffset()和afd.getLength()时,此代码有效,但是当我尝试如上所述从中间提取想要的字节时,我得到

AssetFileDescriptor afd = context.getAssets().openFd(bundleFile);

long startOffset = clip.byteOffset;
long length = clip.assetLength;


Log.i(TAG,"open: Loading from bundle startOffset: " + startOffset + " length: " + length);

extractor = new MediaExtractor();

extractor.setDataSource(afd.getFileDescriptor(),startOffset,length);
extractor.selectTrack(0);
extractor.seekTo(offsetUS,MediaExtractor.SEEK_TO_NEXT_SYNC);

afd.close();

MediaFormat fmt = extractor.getTrackFormat(0);
String mimeType = fmt.getString(MediaFormat.KEY_MIME);

decoder = MediaCodec.createDecoderByType(mimeType);

因此,在我看来,这似乎是不可能的。我怀疑MediaExtractor使用文件扩展名来解析标头或类似的内容,并且不知道将此数据解释为m4a。

是否有另一种方法可以实现为多个aac文件使用单个捆绑文件的目标?我当时想我可以通过InputFileStream或类似的方式手动输入MediaCodec。

谢谢!

解决方法

您是否尝试过设置绝对偏移量?

extractor.setDataSource(afd.getFileDescriptor(),afd.getStartOffset() + startOffset,length);

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...