So werden PCM-Samples aus der Ausgabe des MediaCodec-Decoders extrahiert

8

Ich versuche, die PCM-Samples für die weitere Verarbeitung aus einem decodierten MP4-Puffer zu erhalten. Ich extrahiere zuerst die Audiospur aus einer Videodatei, die mit der Kameraapplikation des Telefons aufgenommen wurde, und ich habe sichergestellt, dass die Audiospur ausgewählt wird, wenn ich die "audio / mp4" -Mime-Taste:

bekomme %Vor%

Danach iteriere ich durch die Spur, füttere den Codec mit dem Strom codierter Zugriffseinheiten und ziehe die decodierten Zugriffseinheiten in einen ByteBuffer (das ist Code, den ich aus einem Video-Rendering-Beispiel, das hier gepostet wurde, wieder herstelle Ссылка ):

%Vor%

Der Code scheint bis jetzt fehlerfrei zu funktionieren, aber ich bin gerade dabei, herauszufinden, wie man die PCM-Samples vom ByteBuffer erhält, der den Wert des Ausgabepuffers nimmt. Ich nehme an, ich könnte davon ausgehen, dass, da ich mit 16-Bit-Stereo-Audiodatei arbeite, mindestens zwei Bytes in einem verschachtelten Schema sein sollten ... aber ich bin nicht wirklich sicher daran, also die PCM-Samples unzweideutig abzurufen aus diesem Bytestrom. Weiß jemand wie man diese von der MediaCodec API bekommt?

Ich habe ein paar Alternativen mit ffmpeg oder openSL gelesen, aber da ich neu in der Android-Programmierung bin, hatte ich gehofft, die Komplikationen bei der Verwendung von c-basierten APIs zu vermeiden und meine erste App nur mit den Tools von Android zu erstellen Framework (Ich verwende KitKat). Jede Hilfe wird sehr geschätzt.

UPDATE : Ich konnte die PCM-Samples extrahieren, so wie ich es angenommen habe und auch die Art und Weise wie @ marcone darauf hingewiesen hat. Um dies zu tun, habe ich diese Zeilen unterhalb der Pufferzuweisung hinzugefügt:

%Vor%

und schließlich schreiben Sie das Byte-Array in eine Datei durch:

%Vor%

Das Problem, mit dem ich es jetzt zu tun habe, ist:

Die decodierten Audio-Samples stimmen nicht exakt mit der Decodierung der mp4-Audiospur von iZotope überein. Es gibt einen 48-Abtastwert-Mismatch in der Wave-Dateigröße und eine Verzögerung von 2112 Abtastwerten in den dekodierten Signalen. Meine Frage ist jetzt: Würden alle mp4-Decoder den gleichen PCM-Ausgangsstrom liefern, oder hängt das von der Implementierung des Decoders ab?

    
jimijazz 26.03.2014, 21:04
quelle

1 Antwort

2

Ich habe festgestellt, dass die Verzögerungen durch die AAC-Kodierung verursacht werden, wie hier erklärt:

Ссылка

In meinem Fall ist die Priming-Zeit immer 2112 Samples und der Rest ist abhängig von der Audio-Größe natürlich variabel.

    
jimijazz 31.03.2014, 20:47
quelle

Tags und Links