MediaExtractor 从多个音频文件中提取
MediaExtractor extract from bundle of multiple audio files
我正在尝试使用 MediaExtractor 和 MediaCodec 播放打包在单个文件中的 AAC (m4a)。
文件结构是这样的......
HEADER
track1.m4a
track2.m4a
等...
其中 header 包含其下方打包的音频文件的偏移量和长度。
我正在尝试为这些单独的文件创建 MediaExtractors,如下所示:
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);
当我只是从资产加载 m4a 文件并使用 afd.getStartOffset() 和 afd.getLength() 时,此代码有效但是当我尝试从中间提取我想要的字节时如上,我得到
java.io.IOException: Failed to instantiate extractor
at android.media.MediaExtractor.setDataSource(Native Method)
所以我很清楚这可能是不可能的。我怀疑 MediaExtractor 使用文件扩展名来解析 header 或类似的东西,并且不知道将此数据解释为 m4a.
是否有另一种方法可以实现为多个 aac 文件创建一个捆绑文件的目标?我在想我可以用 InputFileStream 或类似的东西手动输入 MediaCodec...
谢谢!
你试过设置绝对偏移量吗?
extractor.setDataSource(afd.getFileDescriptor(), afd.getStartOffset() + startOffset, length);
我正在尝试使用 MediaExtractor 和 MediaCodec 播放打包在单个文件中的 AAC (m4a)。
文件结构是这样的......
HEADER
track1.m4a
track2.m4a
等...
其中 header 包含其下方打包的音频文件的偏移量和长度。
我正在尝试为这些单独的文件创建 MediaExtractors,如下所示:
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);
当我只是从资产加载 m4a 文件并使用 afd.getStartOffset() 和 afd.getLength() 时,此代码有效但是当我尝试从中间提取我想要的字节时如上,我得到
java.io.IOException: Failed to instantiate extractor
at android.media.MediaExtractor.setDataSource(Native Method)
所以我很清楚这可能是不可能的。我怀疑 MediaExtractor 使用文件扩展名来解析 header 或类似的东西,并且不知道将此数据解释为 m4a.
是否有另一种方法可以实现为多个 aac 文件创建一个捆绑文件的目标?我在想我可以用 InputFileStream 或类似的东西手动输入 MediaCodec...
谢谢!
你试过设置绝对偏移量吗?
extractor.setDataSource(afd.getFileDescriptor(), afd.getStartOffset() + startOffset, length);