Como altero o tamanho do quadro, preservando a largura (usando ffmpeg)?


21

Eu sou novo neste site StackExchange e em usar o codificador FFmpeg. Eu tenho um vídeo que é 720x480 (3: 2) que gostaria de mudar para 720x406 (16: 9) para corresponder aos outros vídeos que tenho para um site. Eu tentei várias combinações de comandos, incluindo:

ffmpeg -i myfile.mv4 -s 720x406 outfile.mp4
ffmpeg -i myfile.m4v -c copy -aspect 16:9 outfile.mp4

Acabo com um vídeo que foi reduzido à altura especificada, mas não preservou a largura. Termina em 608x406 ou nos arredores. Eu tenho jogado com várias versões GUI do FFmpeg hoje, e elas parecem fazer a mesma coisa.

Quais seriam as opções / parâmetros adequados a serem passados ​​(assumindo que terei mais controle via linha de comando) para atingir o tamanho de quadro desejado?

Respostas:


36

usar o filtro de escala fará isso, mas há um pouco mais.

ffmpeg -i input.mov -vf scale=720x406 output.mov 

criará um filme com as dimensões de pixel necessárias, mas se você observar a saída, verá que ela adiciona informações aos metadados para que seja reproduzida na mesma proporção que o original, usando pixels não quadrados. Portanto, se você deseja esticar o filme anamorficamente para uma nova proporção, você precisa definir manualmente a proporção de pixel, chamada SAR para "Sample Aspect Ratio", portanto, para pixels quadrados, use:

ffmpeg -i input.mov -vf scale=720x406,setsar=1:1 output.mov

Como alternativa, você pode definir a proporção da tela para o que quiser, assim:

ffmpeg -i input.mov -vf scale=720x406,setdar=16:9 output.mov

O que estou fazendo com o comando -vf e as expressões x = y, z = a seguir são a criação de uma cadeia de filtros . Os filtros podem ser bastante complexos, mas no uso mais simples, eles assumem o formato effect=parameter,nexteffect=anotherparametere são processados ​​na ordem em que você os escreve.

Você pode querer colocar comandos adicionais para o codec e assim por diante, por exemplo, -c:v libx264para usar o codificador x264 mp4 e algo como -crf 20definir o fator de taxa constante como 20 (geralmente um bom compromisso entre tamanho e qualidade). Portanto, um comando razoavelmente completo se pareceria com:

ffmpeg -i input.mov -vf scale=720x406,setdar=16:9 -c:v libx264 -preset slow -profile:v main -crf 20 output.mov

O perfil principal é bom para a compatibilidade do dispositivo, a slowpredefinição para o codificador libx264 é um bom equilíbrio de velocidade e qualidade; portanto, este é um bom cavalo de batalha de codificação da web em geral. Você pode torná-lo mais rápido usando fastou veryfastmais devagar veryslowe placeboo tornará um pouco melhor do que veryslowàs custas de muito mais tempo de processamento (daí o nome).

BTW Não use cópia -c , isso significa que basta copiar o vídeo e áudio sem fazer nada para eles em tudo , por isso nada que você faz em termos de escala, codec, bitrate etc terá qualquer efeito.


1
Se você estiver usando versões recentes do ffmpeg, não precisará mais estipular x264 como codec, mas ainda vale a pena examinar as configurações desejadas.
STIB

1
Eu acho que os metadados só têm um campo DAR. Então, o uso setsaré apenas definir indiretamente o DAR?
jiggunjer

Eu tenho que usar "-c copy", mas por outro lado eu quero redimensionar a tela. Como posso conseguir isso?
Dr.jacky

1
@ Mr.Hyde, você deve fazer isso como uma nova pergunta, em vez de fazer um comentário
stib
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.