¿Cómo inicializar MediaFormat para configurar un MediaCodec para decodificar datos AAC en bruto?
Tengo un problema extraño con mi StreamPlayer y necesito la ayuda que pueda obtener.
El objetivo principal que debo alcanzar es StreamPlayer, que puede reproducir flujos de transporte MPEG-2 con la menor latencia posible. Para esto estoy siguiendo este enfoque:
La secuencia es analizada por un analizador de TS basado en Java. He implementado un TSExtractor que es similar al MediaExtractor y que funciona bien. Puedo recibir todas las muestras de medios para una pista seleccionada de la misma manera que es posible usando el MediaExtractor con
extractor.readSampleData(...);
extractor.advance();
Para decodificar los datos AAC quiero crear y configurar una instancia de MediaCodec. Usando la clase MediaExtractor esto es usualmente hecho por
MediaFormat mediaFormat = extractor.getTrackFormat(i);
decoder = MediaCodec.createDecoderByType(mediaFormat.getString(MediaFormat.KEY_MIME));
decoder.configure(mediaFormat, null, null, 0);
Como tengo que inicializar el MediaFormat en el método TSExtractor.getTrackFormat (int track) que uso
MediaFormat mf = MediaFormat.createAudioFormat ("audio/mp4a-latm", getSampleRate(), getChannelCount());
y porque todas mis muestras de AAC incluyen un ADTS que hago
mediaFormat.setInteger(MediaFormat.KEY_IS_ADTS, 1);
Despues de leeresta publicar finalmente agrego un marco ESDS usando la tecla "csd-0"
mediaFormat.setByteBuffer("csd-0", ByteBuffer.allocate(2).put(new byte[]{(byte) 0x11, (byte)0x90}));
donde los valores 0x11 y 0x90 se extraen de los ADTS.
Cuando ahora quiero decodificar el AAC muestrea las publicaciones del decodificador
AAC decoder returned error 4097, substituting silence
al registro.
Para verificar que mi TSExtractor extraiga las muestras correctamente, grabé el mismo flujo usando VLC y lo envolví a un archivo mp4 sin transcodificar, por lo que el flujo sin procesar no cambia. Ahora puedo inicializar el MediaExtractor con el archivo mp4 grabado y comparar las muestras creadas por mi TSExtractor y el MediaExtractor. Usando rastro y error encontré un comportamiento muy extraño:
Cuando configuro el MediaCodec usando el MediaFormat creado por el MediaExtractor, el MediaCodec decodifica las muestras AAC devueltas por mi TSExtractor sin ningún problema. Comparando el MediaFormat, que básicamente envuelve un HashMap, creado por mi TSExtractor y el creado por el MediaExtractor da estas diferencias:
Creado por MediaExtractor:
mediaFormat: {max-input-size = 1212, durationUs = 77428875, is-adts = 1, channel-count = 2, mime = audio / mp4a-latm, csd-0 = java.nio.ByteArrayBuffer [posición = 0, límite = 2, capacidad = 2], frecuencia de muestreo = 48000}
Creado por TSExtractor:
mediaFormat: {is-adts = 1, channel-count = 2, mime = audio / mp4a-latm, csd-0 = java.nio.ByteArrayBuffer [posición = 2, límite = 2, capacidad = 2], muestra-tasa = 48000}
Incluso cuando adopto el MediaFormat creado por el TSExtractor para que sea similar al creado por el MediaExtractor, el decodificador da el mismo error al usar el autocreado y decodifica sin ningún problema al usar el otro.
Cualquier ayuda sería realmente útil.