Como inicializar o MediaFormat para configurar um MediaCodec para decodificar dados brutos do AAC?

Eu tenho um problema estranho com o meu StreamPlayer e preciso de qualquer ajuda que possa obter.

O principal objetivo que eu preciso alcançar é o StreamPlayer, que é capaz de reproduzir fluxos de transporte MPEG-2 com a menor latência possível. Para isso, estou seguindo essa abordagem:

O fluxo é analisado por um TS Parser baseado em Java. Eu implementei um TSExtractor que é semelhante ao MediaExtractor e que funciona bem. Posso receber todas as amostras de mídia de uma faixa selecionada da mesma forma que é possível usando o MediaExtractor com

extractor.readSampleData(...);
extractor.advance();

Para decodificar os dados do AAC, desejo criar e configurar uma instância do MediaCodec. Usando a classe MediaExtractor isso geralmente é feito por

MediaFormat mediaFormat = extractor.getTrackFormat(i);
decoder = MediaCodec.createDecoderByType(mediaFormat.getString(MediaFormat.KEY_MIME));
decoder.configure(mediaFormat, null, null, 0);

Como eu tenho que inicializar o MediaFormat no método TSExtractor.getTrackFormat (int track) eu uso

MediaFormat mf = MediaFormat.createAudioFormat ("audio/mp4a-latm", getSampleRate(), getChannelCount());

e porque todas as minhas amostras AAC incluem um ADTS eu faço

mediaFormat.setInteger(MediaFormat.KEY_IS_ADTS, 1); 

Depois de leristo post finalmente adiciono um quadro ESDS usando a chave "csd-0"

mediaFormat.setByteBuffer("csd-0", ByteBuffer.allocate(2).put(new byte[]{(byte) 0x11, (byte)0x90}));

onde os valores 0x11 e 0x90 são extraídos do ADTS.

Quando eu agora quero decodificar as amostras AAC os posts decodificador

AAC decoder returned error 4097, substituting silence

para o log.

Para verificar se o meu TSExtractor extrai as amostras corretamente, gravei o mesmo fluxo usando o VLC remuxando-o para um arquivo mp4 sem transcodificação, para que o fluxo bruto não seja alterado. Agora posso inicializar o MediaExtractor com o arquivo mp4 gravado e comparar as amostras criadas pelo meu TSExtractor e pelo MediaExtractor. Usando trilha e erro eu encontrei um comportamento muito estranho:

Quando configuro o MediaCodec usando o mediaFormat criado pelo MediaExtractor, o MediaCodec decodifica as amostras AAC retornadas pelo TSExtractor sem problemas. Comparar o MediaFormat, que basicamente envolve um HashMap, criado pelo meu TSExtractor e aquele criado pelo MediaExtractor, fornece essas diferenças:

Criado por MediaExtractor:

mediaFormat: {max-input-size = 1212, durationUs = 77428875, is-adts = 1, contagem de canais = 2, mimo = áudio / mp4a-latm, csd-0 = java.nio.ByteArrayBuffer [posição = 0, limite = 2, capacidade = 2], taxa de amostragem = 48000}

Criado por TSExtractor:

mediaFormat: {is-adts = 1, contagem de canais = 2, mimo = áudio / mp4a-latm, csd-0 = java.nio.ByteArrayBuffer [posição = 2, limite = 2, capacidade = 2], taxa de amostragem = 48000}

Mesmo quando eu adoto o MediaFormat criado pelo TSExtractor para ser semelhante ao criado pelo MediaExtractor, o decodificador dá o mesmo erro usando o auto criado e decodifica sem nenhum problema usando o outro.

Qualquer ajuda seria realmente útil.

questionAnswers(4)

yourAnswerToTheQuestion