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.