Preciso converter uma demonstração surround Dolby 5.1 em M2TS (H264-AC3) para WebM (VP9-Opus)
Encontrei um processo de duas etapas para fazer isso aqui: https://gist.github.com/vielhuber/cf918eed2b5cc9eaa63f
O primeiro comando renderiza com sucesso com panorâmica alta e correta para o som surround 5.1:
ffmpeg -i dolbyTest-Win10-Final.m2ts -vcodec libx264 -crf 20 -acodec ac3 -vf "yadif" test.mp4
Infelizmente, embora a segunda etapa seja executada com sucesso e crie um sinal de áudio alto, ela corrompe a panorâmica frontal/traseira:
ffmpeg -i test.mp4 -af "channelmap=channel_layout=5.1" test2.webm
Tentei algumas configurações diferentes para corrigir o erro na segunda etapa, mas a panorâmica frontal/traseira está sempre errada.
Existem configurações/interruptores melhores que eu possa usar na segunda etapa para obter a panorâmica correta do alto-falante?
REFERÊNCIAS:
https://scribbleghost.net/2022/12/29/convert-audio-to-opus-with-ffmpeg/
https://ffmpeg.org/ffmpeg.html#Advanced-Audio-options
NOTA: Você é bem-vindo para olhar minhas edições se quiser. Estou apenas tentando tornar essa questão mais fácil de entender agora que metade do problema parece resolvido.
Só para esclarecer, geralmente no FFmpeg sempre dizemos o que queremos, não o que temos , exceto quando especificamos o arquivo de entrada.
Além disso, no segundo comando você usa
channelmap
which é usado para remapear canais de áudio explicitamente. Mas isso não é necessário porque o áudio já está em 5.1. Em vez disso, usamos-map
( mapeamento ).Aqui está a essência:
ffmpeg
Inicia o FFmpeg.
-i input.m2ts
Especifica o arquivo de entrada (fonte). No seu caso, um arquivo Blu-ray.
-map 0:v:0
Embora incomum, alguns arquivos de vídeo podem ter múltiplas trilhas de vídeo. Como estamos usando mapeamento , precisamos dizer explicitamente ao FFmpeg para selecionar o primeiro fluxo de vídeo do arquivo de entrada.
0
refere-se ao arquivo de entrada (o primeiro arquivo, neste casoinput.m2ts
).v:0
especifica o primeiro fluxo de vídeo naquele arquivo. Lembre-se de que um fluxo é o mesmo que uma trilha na maioria dos tocadores de mídia.-map 0:a:0
Como os arquivos de vídeo podem ter múltiplas trilhas de áudio e estamos usando mapeamento , precisamos dizer explicitamente ao FFmpeg para selecionar o primeiro fluxo de áudio do arquivo de entrada. Isso, é claro, pressupõe que você tenha apenas uma trilha de áudio.
0
refere-se ao arquivo de entrada (o primeiro arquivo, neste casoinput.m2ts
).a:0
especifica o primeiro fluxo de áudio naquele arquivo. Se tiver vários fluxos de áudio e quiser todos eles, você pode usar-map 0:a
, mas como os fluxos de áudio podem ser de codecs e canais diferentes, isso pode rapidamente ficar complicado.-c:v libvpx-vp9
Isso define o codec de vídeo de saída como libvpx-vp9, que é o codec de vídeo VP9 usado para codificar arquivos WebM.
-crf 20 -b:v 0
A julgar pelos seus comandos, parece que você quer usar Constant Quality. Isso é ótimo se sua única preocupação for a qualidade visual. Nesse caso, você também deve definir
-b:v 0
. Se não, você usará o modo Constrained Quality (CQ). O CRF vai de 0 a 63, onde 0 é o melhor e 63 é o pior.-c:a libopus
Define o codec de áudio para libopus, que é o codec de áudio usado para codificar áudio Opus.
-b:a 265k
Como você deseja converter o áudio com "degradação mínima de áudio", você pode definir a taxa de bits para 256 kbps (o que é recomendado pelo xiph.org para áudio 5.1 em Oups) ou, alternativamente, você pode optar por uma taxa de bits de áudio mais alta, como 450 kbps (ou o máximo de 510 kbps), mas isso não necessariamente fará uma diferença audível.
-ac 6
Isso define o número de canais de áudio para 6. O surround 5.1 tem 6 canais.
Como bônus, já que legendas são comuns em arquivos m2ts, você pode escolher omiti-las com
-sn
ou incluí-las com-map 0:s
. Eu deixei isso de fora do código de exemplo.