Wie initialisiere ich MediaFormat, um einen MediaCodec zum Dekodieren von AAC-Rohdaten zu konfigurieren?

Ich habe ein seltsames Problem mit meinem StreamPlayer und benötige jede Hilfe, die ich bekommen kann.

Das Hauptziel, das ich erreichen muss, ist StreamPlayer, der MPEG-2-Transportströme mit möglichst geringer Latenz wiedergeben kann. Dafür verfolge ich diesen Ansatz:

Der Stream wird von einem Java-basierten TS-Parser analysiert. Ich habe einen TSExtractor implementiert, der dem MediaExtractor ähnlich ist und gut funktioniert. Ich kann alle Medienbeispiele für einen ausgewählten Titel auf dieselbe Weise empfangen, wie es mit dem MediaExtractor möglich ist

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

Um die AAC-Daten zu dekodieren, möchte ich eine Instanz von MediaCodec erstellen und konfigurieren. Bei Verwendung der MediaExtractor-Klasse wird dies normalerweise von ausgeführt

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

Da ich das MediaFormat in der von mir verwendeten Methode TSExtractor.getTrackFormat (int track) initialisieren muss

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

und weil alle meine AAC-Beispiele ein ADTS enthalten, das ich mache

mediaFormat.setInteger(MediaFormat.KEY_IS_ADTS, 1); 

Nach dem Lesendiese post Ich füge endlich einen ESDS-Frame mit der "csd-0" -Taste hinzu

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

wobei die Werte 0x11 und 0x90 aus dem ADTS extrahiert werden.

Wenn ich jetzt die AAC-Samples dekodieren will, postet der Dekoder

AAC decoder returned error 4097, substituting silence

zum Log.

Um zu überprüfen, ob mein TSExtractor die Samples korrekt extrahiert, habe ich denselben Stream mit VLC aufgezeichnet und ihn in eine mp4-Datei umgewandelt, ohne ihn zu transkodieren, sodass der Raw-Stream unverändert bleibt. Jetzt kann ich den MediaExtractor mit der aufgezeichneten MP3-Datei initialisieren und die von meinem TSExtractor und dem MediaExtractor erstellten Samples vergleichen. Unter Verwendung von trail und error habe ich ein sehr merkwürdiges Verhalten festgestellt:

Wenn ich den MediaCodec mit dem vom MediaExtractor erstellten mediaFormat konfiguriere, decodiert der MediaCodec die von meinem TSExtractor zurückgegebenen AAC-Beispiele ohne Probleme. Der Vergleich des von meinem TSExtractor erstellten und des vom MediaExtractor erstellten MediaFormat, der im Grunde genommen eine HashMap umschließt, ergibt folgende Unterschiede:

Erstellt von MediaExtractor:

mediaFormat: {max-input-size = 1212, durationUs = 77428875, is-adts = 1, channel-count = 2, mime = audio / mp4a-latm, csd-0 = java.nio.ByteArrayBuffer [position = 0, limit = 2, Kapazität = 2], Abtastrate = 48000}

Erstellt von TSExtractor:

mediaFormat: {is-adts = 1, channel-count = 2, mime = audio / mp4a-latm, csd-0 = java.nio.ByteArrayBuffer [position = 2, limit = 2, capacity = 2], sample-rate = 48000}

Selbst wenn ich das vom TSExtractor erstellte MediaFormat so anpasse, dass es dem vom MediaExtractor erstellten ähnelt, gibt der Decoder den gleichen Fehler aus, wenn er das selbst erstellte verwendet, und decodiert problemlos mit dem anderen.

Jede Hilfe wäre sehr hilfreich.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage