Wie konvertiert man die Abtastrate von AV_SAMPLE_FMT_FLTP in AV_SAMPLE_FMT_S16?

7

Ich entschlüssle aac zu pcm mit ffmpeg mit avcodec_decode_audio3. Allerdings dekodiert es in AV_SAMPLE_FMT_FLTP Sample-Format (PCM 32bit Float Planar) und ich brauche AV_SAMPLE_FMT_S16 (PCM 16 Bit signiert - S16LE).

Ich weiß, dass ffmpeg dies leicht mit -sample_fmt tun kann. Ich möchte das gleiche mit dem Code tun, aber ich konnte es immer noch nicht herausfinden.

audio_resample hat nicht funktioniert: es schlägt mit Fehlermeldung: .... Konvertierung fehlgeschlagen.

    
frankish 20.02.2013, 20:35
quelle

3 Antworten

35

BEARBEITEN 9. April 2013 : Arbeite raus, wie libswresample dazu benutzt wird ... viel schneller!

Irgendwann in den letzten 2-3 Jahren hat sich das Ausgabeformat von FFmpegs AAC-Decoder von AV_SAMPLE_FMT_S16 auf AV_SAMPLE_FMT_FLTP geändert. Dies bedeutet, dass jeder Audiokanal über einen eigenen Puffer verfügt und jeder Abtastwert ein 32-Bit-Fließkommawert ist, der von -1,0 bis +1,0 skaliert ist.

Während sich mit AV_SAMPLE_FMT_S16 die Daten in einem einzigen Puffer befinden, wobei die Abtastwerte verschachtelt sind, und jeder Abtastwert eine Ganzzahl mit Vorzeichen von -32767 bis +32767 ist.

Und wenn Sie Ihr Audio wirklich als AV_SAMPLE_FMT_S16 benötigen, müssen Sie die Konvertierung selbst durchführen. Ich habe zwei Möglichkeiten herausgefunden:

1. Verwenden Sie libswresample (empfohlen)

%Vor%

Und das ist alles, was Sie tun müssen!

2. Tun Sie es manuell in C (ursprüngliche Antwort, nicht empfohlen)

Also, in Ihrer Dekodierschleife, wenn Sie ein Audiopaket haben, dekodieren Sie es so:

%Vor%

Und dann, wenn Sie einen vollen Rahmen von Audio haben, können Sie es ziemlich leicht konvertieren:

%Vor%

Ich habe ein paar Dinge aus Gründen der Klarheit weggelassen ... die Klemmung im Mono-Pfad sollte idealerweise im Stereo-Pfad dupliziert werden. Und der Code kann einfach optimiert werden.

    
Reuben Scratton 12.03.2013, 21:23
quelle
5

Ich habe 2 Resample-Funktionen von FFMPEG gefunden. Die Leistung ist vielleicht besser.

  1. avresample_convert () Ссылка
  2. swr_convert () Ссылка
Albert Liao 08.04.2013 07:43
quelle
2

Danke Reuben für eine Lösung. Ich habe festgestellt, dass einige der Sample-Werte im Vergleich zu einem geraden ffmpeg -i file.wav etwas aus waren. Es scheint, dass sie bei der Konvertierung eine runde () auf den Wert verwenden.

Um die Konvertierung durchzuführen, habe ich das getan, was Sie getan haben, um ein Gebot für eine beliebige Anzahl von Kanälen zu erstellen:

%Vor%

Ich ging von ffmpeg 0.11.1 - & gt; 1.1.3 und fand die Änderung des Stichprobenformats ärgerlich. Ich schaute auf die Einstellung der request_sample_fmt auf AV_SAMPLE_FMT_S16, aber es scheint, dass der AAC-Decoder sowieso nichts anderes als AV_SAMPLE_FMT_FLTP unterstützt.

    
Brad Mitchell 21.03.2013 22:29
quelle

Tags und Links