Eu tentei descobrir isso sozinho, mas a infinidade de opções me deixa perplexo.
Eu quero usar idealmente ffmpeg
ou mencoder
(ou qualquer outra coisa, mas os dois que eu sei que estou trabalhando) para converter qualquer vídeo recebido em um tamanho de tela fixo.
Se o vídeo for mais amplo ou muito curto, corte o vídeo no centro. Se não for o tamanho certo, redimensione para cima ou para baixo para torná-lo exatamente o tamanho fixo da tela.
A coisa final exata que preciso é de 720x480 em um XVid AVI com uma faixa de áudio MP3.
Encontrei muitas páginas mostrando como redimensionar para uma resolução máxima, mas preciso que o vídeo seja exatamente essa resolução (com partes extras cortadas, sem barras pretas).
Alguém pode me dizer a linha de comando para executar - ou pelo menos me levar um pouco / quase lá? Se precisar ser de várias linhas de comando (execute X para obter a resolução, faça esse cálculo e, em seguida, execute Y com a saída desse cálculo) eu posso criar um script.
fonte
Respostas:
Não sou um guru do ffmpeg, mas isso deve funcionar.
Primeiro de tudo, você pode obter o tamanho da entrada de vídeo como este:
Com um ffmpeg razoavelmente recente, você pode redimensionar seu vídeo com estas opções:
Você pode definir a largura ou a altura
-1
para permitirffmpeg
redimensionar o vídeo mantendo a proporção. Na verdade,-2
é uma escolha melhor, pois o valor calculado deve ser uniforme. Então você pode digitar:Depois de obter o vídeo, ele pode ser maior do que o esperado,
720x480
pois vocêffmpeg
calcula a altura e, portanto, precisa cortá-lo. Isso pode ser feito assim:Por fim, você pode escrever um script como este (pode ser facilmente otimizado, mas eu o mantive simples por legibilidade):
fonte
echo "scale=3; ${in_width}/${out_width}*1000"| bc | awk '{printf "%d", $0}'
h_rate =echo "scale=3; ${in_height}/${out_height}*1000"| bc | awk '{printf "%d", $0}'
# Vamos usar o lado mais curto, para que o vídeo seja pelo menos tão grande quanto o tamanho desejado e recorte o lado mais longo: crop_side = 'n' if [$ {w_rate} -gt $ {h_rate}]; então scale = "- 2: $ {out_height}" crop_side = 'w' else scale = "$ {out_width}: - 2" crop_side = 'h' fi `Substitua "input.file" pelo nome do seu arquivo de entrada.
fonte
-c:a copy scaled_result.mp4
Se você deseja cortar e escalar de uma só vez, é possível criar uma cadeia de filtros de cortar e escalar da seguinte maneira:
O primeiro acima corta um vídeo para retrato 16: 9 e, em seguida, aumenta para 400 px x a largura apropriada (número par).
fonte
Eu sou novo no ffmpeg, mas agora tenho um pequeno conversor interessante no VB.NET que cria filmes em bruto de vários formatos de saída para uso em pequenos dispositivos com acesso ao cartão SD, mas sem energia suficiente para decodificar vídeos complexos.
Devido à maneira como funciona ao redimensionar e cortar, tive que codificá-lo manualmente e criar os parâmetros. Basicamente, preciso saber a largura e a altura resultantes.
Eu tenho 2 caixas de seleção para as opções: -
Preservar proporção (X) Preencher todos os pixels (X)
Somente 4 variáveis são necessárias como entrada (1) Largura do vídeo original, (2) Altura do vídeo original, (3) Largura do dispositivo, (4) Altura do dispositivo.
Embora o VB.NET pudesse ser adaptado com bastante facilidade para qualquer idioma.
fonte