Как инициализировать MediaFormat для настройки MediaCodec для декодирования необработанных данных AAC?
У меня странная проблема с моим StreamPlayer, и мне нужна помощь, которую я могу получить.
Основной целью, которую мне нужно достичь, является StreamPlayer, который способен воспроизводить транспортные потоки MPEG-2 с наименьшей возможной задержкой. Для этого я придерживаюсь этого подхода:
Поток анализируется анализатором TS на основе Java. Я реализовал TSExtractor, который похож на MediaExtractor и который отлично работает. Я могу получить все медиа образцы для выбранной дорожки так же, как это возможно с помощью MediaExtractor с
extractor.readSampleData(...);
extractor.advance();
Для декодирования данных AAC я хочу создать и настроить экземпляр MediaCodec. Используя класс MediaExtractor, это обычно делается
MediaFormat mediaFormat = extractor.getTrackFormat(i);
decoder = MediaCodec.createDecoderByType(mediaFormat.getString(MediaFormat.KEY_MIME));
decoder.configure(mediaFormat, null, null, 0);
Поскольку я должен инициализировать MediaFormat в методе TSExtractor.getTrackFormat (int track), который я использую
MediaFormat mf = MediaFormat.createAudioFormat ("audio/mp4a-latm", getSampleRate(), getChannelCount());
и потому что все мои образцы AAC включают ADTS, я делаю
mediaFormat.setInteger(MediaFormat.KEY_IS_ADTS, 1);
После прочтенияэтот опубликовать, наконец, добавить кадр ESDS, используя "CSD-0" ключ
mediaFormat.setByteBuffer("csd-0", ByteBuffer.allocate(2).put(new byte[]{(byte) 0x11, (byte)0x90}));
где значения 0x11 и 0x90 извлекаются из ADTS.
Когда я теперь хочу декодировать образцы AAC, посты декодера
AAC decoder returned error 4097, substituting silence
в журнал.
Чтобы убедиться, что мой TSExtractor правильно извлекает сэмплы, я записал один и тот же поток, используя VLC, перекомпоновав его в файл mp4 без транскодирования, чтобы исходный поток не изменился. Теперь я могу инициализировать MediaExtractor с записанным файлом mp4 и сравнить образцы, созданные моим TSExtractor и MediaExtractor. Используя след и ошибку, я обнаружил очень странное поведение:
Когда я настраиваю MediaCodec, используя mediaFormat, созданный MediaExtractor, MediaCodec декодирует образцы AAC, возвращенные моим TSExtractor, без каких-либо проблем. Сравнение MediaFormat, который в основном оборачивает HashMap, созданный моим TSExtractor, и созданный MediaExtractor, дает следующие различия:
Создано MediaExtractor:
mediaFormat: {max-input-size = 1212, durationUs = 77428875, is-adts = 1, count-count = 2, mime = audio / mp4a-latm, csd-0 = java.nio.ByteArrayBuffer [position = 0, limit = 2, емкость = 2], частота дискретизации = 48000}
Создано TSExtractor:
mediaFormat: {is-adts = 1, количество каналов = 2, mime = аудио / mp4a-latm, csd-0 = java.nio.ByteArrayBuffer [позиция = 2, лимит = 2, емкость = 2], частота дискретизации = 48000}
Даже когда я принимаю MediaFormat, созданный TSExtractor, чтобы он был похож на тот, который создан MediaExtractor, декодер выдает ту же ошибку, используя самостоятельно созданный, и декодирует без каких-либо проблем, используя другой.
Любая помощь будет очень полезна.