#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(). Не думал прямо. В итоге получилось сочетание этого и не включая окончание последней строки в моей длине заголовка, что привело к ошибкам с парой ошибок.