Transcodificar audio 5.1 en ffmpeg conduce a una asignación de audio incorrecta en la salida

Necesito transcodificar algunos videos de alta resolución (archivos prores o dnxhd con audio 5.1 sin comprimir de 48 kHz en un contenedor MOV) a su baja resolución h264 con AAC manteniendo el audio aún en 5.1 preservando su asignación de canales.

Para hacerlo, traté de usar este comando:

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

La versión que estoy usando es ffmpeg version N-87584-g47d6b02f6c-Reinobastante nueva.

Lo que sucede es que incluso si el procesamiento de video está bien, para la parte de audio, mis canales están asignados incorrectamente... para explicar mejor lo que sucede, hice una captura de pantalla de las formas de onda antes y después en Adobe Audition.

Estas son las formas de onda del archivo de entrada :

formas de onda en mi video de origen

En cambio, estas son las formas de onda del archivo transcodificado :

las formas de onda cambiaron después de la transcodificación

Nuevamente, permítanme publicar las partes de ffprobe relacionadas con el audio:

fichero de entrada:

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

archivo transcodificado:

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

y para terminar MediaInfo Lite

archivo original:

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

archivo transcodificado:

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

Si reproduce el archivo mp4 con VLC, escuchará claramente que algo se intercambió mal.

Estoy abierto a una solución;)

Respuestas (1)

FFmpeg asume que el mapeo de canales 5.1 de la entrada es el mismo que usa. Para corregir eso, use el filtro de mapa de canales para reasignar, agregue:

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

(Lo basé en las etiquetas de los canales a la derecha de tus imágenes)

Encontré que funcionaba para mis propósitos: -af "channelmap=0|1|4|5|2|3:5.1"
Solo una pregunta, lo que me pregunto es... ¿Por qué con ffmpeg tengo que especificar el orden de los canales manualmente cuando, en cambio, un reproductor como VLC que se basa en libavcodec puede determinarlo automáticamente? ¿No debería ffmpeg hacer lo mismo? Puedo entender especificar manualmente el tipo de canal 5.1 para la salida pero no para la entrada.
El demuxer señala el diseño del canal al decodificador y VLC usa el suyo propio. En ffmpeg, el demuxer QT reconoce el diseño en su MOV, pero ffmpeg internamente tiene una designación única para 5.1, por lo que no se reordena cuando se envía al codificador.
Ya veo, esto tiene sentido. No hay ningún tipo de forma de asignarlos automáticamente, ¿entonces? ¿O al menos un comando con ffprobe para leer el diseño del canal interno para poder hacer un script de varias pasadas?