Wie konvertieren von sample-rate von AV_SAMPLE_FMT_FLTP zu AV_SAMPLE_FMT_S16?
Ich bin Dekodieren von aac auf pcm mit ffmpeg mit avcodec_decode_audio3. Aber es decodiert in AV_SAMPLE_FMT_FLTP sample-format (PCM 32bit-Float-Planar) und ich muss AV_SAMPLE_FMT_S16 (PCM 16-bit-signed - S16LE).
Ich weiß, dass ffmpeg kann dies leicht tun mit -sample_fmt. Ich möchte das gleiche zu tun mit dem code, aber ich konnte immer noch nicht herausfinden.
audio_resample nicht funktioniert hat: es scheitert mit der Fehlermeldung: .... Fehler bei der Konvertierung.
- Hast du jemals eine Arbeit, die Antwort auf diese? Bin vor genau demselben problem
Du musst angemeldet sein, um einen Kommentar abzugeben.
BEARBEITEN 9. April 2013: Arbeitete heraus, wie libswresample, dies zu tun... viel schneller!
Irgendwann in den letzten 2-3 Jahren FFmpeg AAC decoder Ausgabeformat geändert von AV_SAMPLE_FMT_S16 zu AV_SAMPLE_FMT_FLTP. Dies bedeutet, dass jeder audio-Kanal hat seinen eigenen Puffer, und jeder sample-Wert ist ein 32-bit-floating-point-Wert skaliert von -1.0 bis +1.0.
In der Erwägung, dass mit AV_SAMPLE_FMT_S16 die Daten in einen einzigen Puffer, die Proben interleaved, und jede Probe ist eine vorzeichenbehaftete Ganzzahl zwischen -32767 bis +32767.
Und wenn Sie wirklich brauchen Ihre audio-als AV_SAMPLE_FMT_S16, dann haben Sie, um die Konvertierung selbst. Dachte ich, zwei Möglichkeiten, es zu tun:
1. Verwenden libswresample (empfohlen)
... Und das ist alles, was Sie zu tun haben!
2. Tun Sie es von hand in C (original-Antwort, nicht empfohlen)
Also in Ihrem decode-Schleife, wenn Sie haben eine audio-Paket Sie decodieren dies wie folgt:
Dann, wenn Sie haben einen full-frame von audio -, können Sie wandeln es ziemlich einfach:
Ich habe Links ein paar Dinge für Klarheit... die Klemmung in der mono-Pfad sollte im Idealfall ebenfalls im stereo-Pfad. Und der code kann leicht optimiert.
Fand ich 2 resample-Funktion von FFMPEG. Die performance vielleicht besser ist.
http://libav.org/doxygen/master/group__lavr.html
Dank Reuben nach einer Lösung für dieses. Ich habe die Erfahrung gemacht, dass einige der sample-Werte waren etwas aus, wenn verglichen mit einer geraden ffmpeg -i Datei.wav. Es scheint, dass bei der Umwandlung, verwenden Sie eine Runde() auf den Wert.
Um die Konvertierung zu tun, ich Tat, was Sie Tat, mit einem Gebot von änderungen funktioniert für jede Anzahl von Kanälen:
Ging ich von ffmpeg 0.11.1 -> 1.1.3 gefunden und das ändern der sample-format nervig. Ich schaute auf die Einstellung der request_sample_fmt zu AV_SAMPLE_FMT_S16 aber es scheint der aac-decoder nicht unterstützt, ist alles andere als AV_SAMPLE_FMT_FLTP sowieso.