Извлечение MediaExtractor из пакета из нескольких аудиофайлов

#android #android-mediacodec #mediaextractor

#Android #android-mediacodec #mediaextractor

Вопрос:

Я пытаюсь использовать MediaExtractor и MediaCodec для воспроизведения AAC (m4a), упакованных вместе в один файл.

Структура файла выглядит следующим образом……

ЗАГОЛОВОК

дорожка1.m4a

дорожка2.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? Я думал, что мог бы вручную загрузить MediaCodec с помощью InputFileStream или чего-то подобного…

Спасибо!

Ответ №1:

Вы пробовали устанавливать абсолютное смещение?

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

Комментарии:

1. Да, спасибо! Не уверен, почему я думал, что могу просто потерять термин afd.getStartOffset(). Не думал прямо. В итоге получилось сочетание этого и не включая окончание последней строки в моей длине заголовка, что привело к ошибкам с парой ошибок.