【问题标题】:MediaExtractor extract from bundle of multiple audio filesMediaExtractor 从多个音频文件包中提取
【发布时间】:2020-08-19 00:03:38
【问题描述】:

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

文件结构是这样的……

标题

track1.m4a

track2.m4a

等等……

标头包含在其下方打包的音频文件的偏移量和长度。

我正在尝试为这些单独的文件创建 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 使用文件扩展名来解析标题或类似的东西,并且不知道将此数据解释为 m4a。

是否有其他方法可以实现为多个 aac 文件提供单个捆绑文件的目标?我在想我可以用 InputFileStream 或类似的东西手动输入 MediaCodec...

谢谢!

【问题讨论】:

    标签: android android-mediacodec mediaextractor


    【解决方案1】:

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

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

    【讨论】:

    • 好的,谢谢!不知道为什么我认为我可能会失去 afd.getStartOffset() 术语。没有好好想。最终成为了它的组合,并且不包括我的标题长度中的最后一行结尾,从而导致一对夫妇的错误。
    猜你喜欢
    • 2016-05-24
    • 2012-07-10
    • 1970-01-01
    • 1970-01-01
    • 2014-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多