Как инициализировать 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, декодер выдает ту же ошибку, используя самостоятельно созданный, и декодирует без каких-либо проблем, используя другой.

Любая помощь будет очень полезна.