Die Transcodierung von 5.1-Audio in ffmpeg führt zu einer falschen Audiozuordnung in der Ausgabe

Ich muss einige hochauflösende Videos (Prores- oder dnxhd-Dateien mit 5.1-unkomprimiertem 48-kHz-Audio im MOV-Container) in ihr h264 mit niedriger Auflösung transcodieren, wobei AAC das Audio in 5.1 behält und ihre Kanalzuordnung beibehält.

Dazu habe ich versucht, diesen Befehl zu verwenden:

ffmpeg -y -i input.mov -c:v libx264 -preset ultrafast -b:v 10000k -c:a libfdk_aac -afterburner 1 -cutoff 20000 -filter:v "scale=-1:720" output.mp4

Die Version, die ich verwende, ist ffmpeg version N-87584-g47d6b02f6c-Reinoziemlich neu.

Was passiert ist, dass selbst wenn die Videoverarbeitung in Ordnung ist, meine Kanäle für den Audioteil falsch zugeordnet werden. Um besser zu erklären, was passiert, habe ich einen Screenshot von Vorher- und Nachher-Wellenformen in Adobe Audition gemacht.

Dies sind die Wellenformen der Eingabedatei :

Wellenformen in meinem Ursprungsvideo

Dies sind stattdessen die Wellenformen der transkodierten Datei:

Wellenformen nach der Transcodierung geändert

Lassen Sie mich noch einmal die ffprobe-Teile posten, die sich auf das Audio beziehen:

Eingabedatei:

Stream #0:1(eng): Audio: pcm_s24le (lpcm / 0x6D63706C), 48000 Hz, 5.1, s32 (24 bit), 6912 kb/s (default)
Metadata:
  creation_time   : 2018-01-02T09:48:58.000000Z
  handler_name    : Apple Alias Data Handler
  timecode        : 00:00:00:00

transcodierte Datei:

Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, 5.1, fltp, 488 kb/s (default)
Metadata:
  handler_name    : SoundHandler

und zum Abschluss MediaInfo Lite

Originaldatei:

Audio
ID                          : 2
Format                      : PCM
Format settings             : Little / Signed
Format settings, Endianness : Little
Format settings, Sign       : Signed
Codec ID                    : lpcm
Duration                    : 1 h 30 min
Bit rate mode               : Constant
Bit rate                    : 6 912 kb/s
Channel(s)                  : 6 channels
Channel positions           : Front: L C R, Back: L R, LFE
Sampling rate               : 48.0 kHz
Bit depth                   : 24 bits
Stream size                 : 4.35 GiB (5%)
Language                    : English
Encoded date                : UTC 2018-01-02 09:48:58
Tagged date                 : UTC 2018-01-02 10:16:46

transcodierte Datei:

Audio
ID                          : 2
Format                      : AAC
Format/Info                 : Advanced Audio Codec
Format profile              : LC
Codec ID                    : mp4a-40-2
Duration                    : 1 h 30 min
Duration_LastFrame          : -8 ms
Bit rate mode               : Constant
Bit rate                    : 489 kb/s
Channel(s)                  : 2 channels
Channel(s)_Original         : 6 channels
Channel positions           : Front: L C R, Side: L R, LFE
Sampling rate               : 48.0 kHz
Frame rate                  : 46.875 FPS (1024 SPF)
Compression mode            : Lossy
Stream size                 : 315 MiB (5%)
Language                    : English
Default                     : Yes
Alternate group             : 1

Wenn Sie die mp4-Datei mit VLC abspielen, hören Sie deutlich, dass etwas schlecht vertauscht ist.

Ich bin offen für eine Lösung ;)

Antworten (1)

FFmpeg geht davon aus, dass die 5.1-Kanalzuordnung des Eingangs mit der verwendeten identisch ist. Um dies zu korrigieren, verwenden Sie den Channelmap-Filter zur Neuzuordnung und fügen Sie Folgendes hinzu:

-af "channelmap=4|0|1|2|3|5:5.1"

(Ich habe es auf den Kanalbezeichnungen rechts in Ihren Bildern basiert)

Ich habe festgestellt, dass es für meine Zwecke funktioniert: -af "channelmap=0|1|4|5|2|3:5.1"
Nur eine Frage, was ich mich frage, ist ... Warum muss ich bei ffmpeg die Kanalreihenfolge manuell angeben, wenn stattdessen ein Player wie VLC, der auf libavcodec basiert, sie automatisch bestimmen kann? Sollte ffmpeg nicht dasselbe tun? Ich kann verstehen, dass die 5.1-Kanal-Variante für die Ausgabe manuell angegeben wird, aber nicht für die Eingabe.
Das Kanallayout wird vom Demuxer an den Decoder gemeldet und VLC verwendet sein eigenes. In ffmpeg erkennt der QT-Demuxer das Layout in Ihrem MOV, aber ffmpeg hat intern eine einzige Bezeichnung für 5.1, sodass es beim Senden an den Encoder nicht neu geordnet wird.
Ich verstehe, das macht Sinn. Gibt es keine Möglichkeit, sie automatisch zuzuweisen? Oder zumindest ein Befehl mit ffprobe, um das interne Kanallayout zu lesen, damit ich ein Multi-Pass-Skript erstellen kann?