Até agora, já transcodifiquei dezenas, se não centenas de arquivos com FFMPEG, mas tenho um arquivo em particular que está me dando problemas e não consigo descobrir o porquê.
Para testar, estou usando um trecho de 10 segundos do meu arquivo original (eu o carregaria como parte desta pergunta se isso fosse um recurso aqui). Este arquivo de teste de origem se parece com isto:
Input #0, matroska,webm, from 'Trimmed.mkv':
HD.MA.5.1-RARBG
ENCODER : Lavf61.9.106
Duration: 00:00:10.26, start: 0.000000, bitrate: 33873 kb/s
Chapters:
[[excluded for relevance]]
Stream #0:0(eng): Video: h264 (High), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], 23.98 fps, 23.98 tbr, 1k tbn
Metadata:
DURATION : 00:00:10.260000000
Stream #0:1(eng): Audio: dts (dca) (DTS-HD MA), 48000 Hz, 5.1(side), s32p (24 bit) (default)
Metadata:
DURATION : 00:00:10.005000000
Stream #0:2(eng): Audio: dts (dca) (DTS), 48000 Hz, 5.1(side), fltp, 1536 kb/s
Metadata:
DURATION : 00:00:10.005000000
Stream #0:3(eng): Audio: ac3, 48000 Hz, stereo, fltp, 192 kb/s
Metadata:
DURATION : 00:00:10.016000000
Posso abrir o arquivo acima no player VLC e confirmar que cada um dos fluxos de áudio (e o fluxo de vídeo) são reproduzidos corretamente. No entanto, muitos players não são tão compatíveis quanto o VLC (não têm tantos codecs incorporados), e preciso oferecer suporte a mais do que isso. No meu caso, preciso oferecer suporte ao Windows Media Player integrado, que (pelo menos no meu computador) não pode reproduzir nenhum dos dois primeiros fluxos de áudio (não pode reproduzir 0:1
dts (dca) (DTS-HD MA)
ou 0:2
dts (dca) (DTS)
). (Tecnicamente, preciso oferecer suporte à reprodução do Chrome, mas ambos os aplicativos parecem ter o mesmo problema aqui, e o Windows Media Player é mais fácil para eu testar.)
Consegui contornar isso em todos os casos anteriores duplicando o fluxo que eu quero e transcodificando a cópia como AAC. Para esse fim, usei o seguinte comando:
ffmpeg -i Trimmed.mkv -map 0:v -map 0:a -map 0:a:0 -c copy -c:a:3 aac Converted.mkv
Eu copio o fluxo de vídeo e todos os fluxos de áudio, e então mapeio o primeiro fluxo de áudio uma segunda vez. Eu defino o codec para todos os fluxos para 'copiar', mas então sobrescrevo esse fluxo de áudio final para usar AAC.
A saída da execução desse comando é a seguinte:
[aost#0:4 @ 000001f6a555fb40] Multiple -codec/-c/-acodec/-vcodec/-scodec/-dcodec options specified for stream 4, only the last option '-codec:a:3 aac' will be used.
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #0:1 -> #0:1 (copy)
Stream #0:2 -> #0:2 (copy)
Stream #0:3 -> #0:3 (copy)
Stream #0:1 -> #0:4 (dts (dca) -> aac (native))
Press [q] to stop, [?] for help
[aac @ 000001f6a591c240] Using a PCE to encode channel layout "5.1(side)"
Output #0, matroska, to 'Converted.mkv':
HD.MA.5.1-RARBG
encoder : Lavf61.9.106
Chapters:
[[excluded for relevance]]
Stream #0:0(eng): Video: h264 (High) (H264 / 0x34363248), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 23.98 fps, 23.98 tbr, 1k tbn
Metadata:
DURATION : 00:00:10.260000000
Stream #0:1(eng): Audio: dts (DTS-HD MA) ([1] [0][0] / 0x2001), 48000 Hz, 5.1(side), s32p (24 bit) (default)
Metadata:
DURATION : 00:00:10.005000000
Stream #0:2(eng): Audio: dts (DTS) ([1] [0][0] / 0x2001), 48000 Hz, 5.1(side), fltp, 1536 kb/s
Metadata:
DURATION : 00:00:10.005000000
Stream #0:3(eng): Audio: ac3 ([0] [0][0] / 0x2000), 48000 Hz, stereo, fltp, 192 kb/s
Metadata:
DURATION : 00:00:10.016000000
Stream #0:4(eng): Audio: aac (LC) ([255][0][0][0] / 0x00FF), 48000 Hz, 5.1(side), fltp, 394 kb/s (default)
Metadata:
encoder : Lavc61.32.101 aac
DURATION : 00:00:10.005000000
[out#0/matroska @ 000001f6a4be8840] video:37636KiB audio:5207KiB subtitle:0KiB other streams:0KiB global headers:0KiB muxing overhead: 0.053611%
frame= 244 fps=203 q=-1.0 Lsize= 42866KiB time=00:00:10.00 bitrate=35098.3kbits/s speed=8.32x
[aac @ 000001f6a591c240] Qavg: 7222.731
Novamente, posso abrir o 'Converted.mkv' resultante no VLC e confirmar que todas as quatro trilhas de áudio são reproduzidas. Mas quando testo esse novo arquivo no Windows Media Player, esse novo, 4º, fluxo AAC fica silencioso. É diferente dos dois primeiros fluxos não suportados, que não consigo selecionar. Esse novo fluxo pode ser selecionado, ele fica apenas silencioso.
O que poderia estar acontecendo que faria com que essa faixa não tocasse corretamente? Por onde eu começaria a depurar isso?
Acho que consegui identificar especificamente o que está causando o problema e uma solução quase perfeita.
Notei algo em minhas horas de depuração e pesquisa. Na minha pergunta original, observe a saída produzida para esse novo fluxo de áudio:
Parece bom, certo? No entanto , se eu então reanalisar esse mesmo arquivo usando
ffprobe
, obtenho o seguinte:Observe que os dados do layout do canal parecem estar totalmente ausentes. Embora o ffmpeg pense que está codificando corretamente com 5.1(lado), parece que isso pode não estar acontecendo corretamente. Houve uma dica de que algo pode estar errado com o layout do canal quando eu estava transcodificando também. Uma pequena mensagem informativa:
Pesquisar mais sobre isso me levou a usar um PCE para codificar o layout do canal 5.1 (lateral) :
Minha teoria é que esse bloco PCE não está sendo escrito corretamente ou que o Windows Media Player (e o media player integrado ao iOS) não sabe como manipular corretamente os dados que estão sendo lidos.
Mantendo essa suposição, decidi tentar converter o layout 5.1(lateral) para apenas 5.1, que é um dos 16 layouts de canais predefinidos suportados pelo AAC. Para fazer isso, usei a resposta para uma pergunta semelhante, Correctly mapping 5.1 to Opus :
Quando adicionei o acima
channelmap
ao meu comando original, o arquivo resultante pôde ser reproduzido em todos os meus dispositivos (incluindo iOS, se eu alterasse o contêiner para .mp4).