Mexendo com vídeo (ffmpeg)

Reduzir tamanho:

ffmpeg -i 20190224_181106.mp4 -vcodec libx264 -fs 20M -crf 20 -s 600X340 out.mp4

para o exemplo acima, o tamanho máximo do vídeo será 20 MB e terá um corte para a proporção 600×340 pixels

Girar:

ffmpeg -i in.mov -vf "transpose=1" out.mov

Para o parâmetro transpose dá pra usar:

0 = girar 90 graus no sentido horário e espelhamento horizontal (padrão)
1 = 90 graus horário apenas
2 = 90 graus antihorário
3 = 90 graus horário com espelhamento vertical

Dá pra usar -vf "transpose=2,transpose=2" para girar 180 graus.

Cortar

ffmpeg -ss 00:01:00 -i input.mp4 -to 00:02:00 -c copy output.mp4

Juntar vídeo com áudio

ffmpeg -y -loglevel ‘repeat+info’ -i ‘file:ARQUIVO_DE_VIDEO.mp4’ -i ‘file:ARQUIVO_DE_AUDIO.ogg’ -c copy -map ‘0:v:0’ -map ‘1:a:0’ ’file:ARQUIVO_DE_DESTINO.mkv

Onde:
-y = “Copia por cima” se já houver um arquivo com o nome ARQUIVO_DE_DESTINO.mkv no diretório de origem. Eu uso isso porque por vezes faço vários testes, então evita de ter que ficar apagando ou recebendo mensagem de “deseja sobrescrever?”
-loglevel ‘repeat+info’ = garante que o log de erros vai ser o mais completo possível. É útil no caso de ter algum problema e precisar pedir ajuda, e uma vez ou outra esses logs já me ajudaram a entender e resolver a situação sozinho
-i = O arquivo de entrada, de origem – esse “i” é de “input”
-c copy = especifica que é para copiar a entrada para a saída, ou seja, não é para substituir os arquivos originais
-map = Basicamente ela está dizendo para pegar todo o stream (o identificador “0”) do vídeo (“:v:”) e jogar em todo (“0”) o stream da saída, assim como pegar o primeiro stream (“1”) do arquivo de áudio (“:a:”) e jogar no stream de áudio (“0”) do arquivo de saída

Converter legenda VTT em SRT:

ffmpeg -i legenda.vtt legenda.srt
 

O FFMPEG é um programa fantástico para lidar com vídeo, muito legal você estar compilando algumas coisas sobre ele aqui. Se eu soubesse programar gostaria de fazer um editor simples baseado no FFMPEG, inicialmente me bastaria que ele cortasse e juntasse, se possível depois iria inserindo uma ou outra funcionalidade. Talvez trabalhar em cima do VSE do Blender seria uma boa, o único grande problema do VSE, pra mim, é que ele não tem precisão de frame, então a cada ação eu preciso esvaziar e atualizar o buffer senão os cortes saem todos errados…

Tentando contribuir um pouco com a sua compilação, um comando que eu uso muito no FFMPEG é juntar um arquivo de vídeo (sem áudio) com um arquivo de áudio. A sintaxe é essa aqui:
ffmpeg -y -loglevel 'repeat+info' -i 'file:ARQUIVO_DE_VIDEO.mp4' -i 'file:ARQUIVO_DE_AUDIO.ogg' -c copy -map '0:v:0' -map '1:a:0' 'file:ARQUIVO_DE_DESTINO.mkv

Os parâmetros são os seguintes:

  • -y = “Copia por cima” se já houver um arquivo com o nome ARQUIVO_DE_DESTINO.mkv no diretório de origem. Eu uso isso porque por vezes faço vários testes, então evita de ter que ficar apagando ou recebendo mensagem de “deseja sobrescrever?”
  • -loglevel 'repeat+info' = garante que o log de erros vai ser o mais completo possível. É útil no caso de ter algum problema e precisar pedir ajuda, e uma vez ou outra esses logs já me ajudaram a entender e resolver a situação sozinho
  • -i = O arquivo de entrada, de origem – esse “i” é de “input
  • -c copy = especifica que é para copiar a entrada para a saída, ou seja, não é para substituir os arquivos originais
  • -map = Basicamente ela está dizendo para pegar todo o stream (o identificador “0”) do vídeo (“:v:”) e jogar em todo (“0”) o stream da saída, assim como pegar o primeiro stream (“1”) do arquivo de áudio (“:a:”) e jogar no stream de áudio (“0”) do arquivo de saída

Espero que tenha ajudado. Eu tenho mais algumas coisas que já usei do FFMPEG que foram úteis em algum momento, mas estão dentro de algum script que já não uso há tempos, vou ver se acho isso.

 
 

que massa, Marcus. Nunca precisei juntar vídeo e áudio, mas é bom ter o comando na mão!
Somei ali na wiki.

 
 

Tive que fazer algumas conversões hoje, aí lembrei dessa página aqui e queria continuar a contribui, se não for um incômodo e na esperança de ajudar. A wiki do site do ffmpeg é bem interessante e uma boa fonte de consulta em caso de necessidade. Os argumentos -y e -loglevel 'repeat+info' podem ser utilizados em todos esses comandos abaixo caso seja desejado, eu os suprimi por já ter exemplificado seu uso na mensagem anterior.

  • Numa situação “de necessidade”, sem acesso à documentação ao à internet, usar a conversão pura do ffmpeg costuma resultar em arquivos menores, pois as opções padrão dele já otimizam a saída (testei aqui com um arquivo de +01:30:00, reduziu uns 20%):
    • ffmpeg -i ARQUIVO_ORIGINAL.mp4 ARQUIVO_CONVERTIDO.mp4
  • No primeiro comando que você listou, “reduzir tamanho”, hoje em dia o .h265 tem conseguido uma taxa de compressão melhor do que o .h264. Para usar esse codec, basta substitui o libx264 por libx265
  • Para reduzir a quantidade de fps do vídeo (substitua o “30” pela quantidade de fps que desejar)(trac.ffmpeg.org/wiki/ChangingFrameRate):
    • ffmpeg -i ARQUIVO_ORIGINAL.mp4 -filter:v fps=30 ARQUIVO_CONVERTIDO.mp4
  • Para alterar a resolução do vídeo mantendo a proporção, usar o filtro -vf fornecendo um componente (largura:altura) e definindo o outro como -1. Para converter, por exemplo, um vídeo de 1280×640 (um aspect ratio bem estranho, mas a gente vê de tudo por aí) para largura de 480 mantendo a razão do aspecto (outras opções interessante em trac.ffmpeg.org/wiki/Scaling):
    • ffmpeg -i ARQUIVO_ORIGINAL.mp4 -vf scale=480:-1 ARQUIVO_CONVERTIDO.mp4
  • Convertendo para webm com VP9 (algoritmo de melhor compressão) com método de duas execuções (2-pass) e qualidade constante (trac.ffmpeg.org/wiki/Encode/VP9):
    • ffmpeg -i ARQUIVO_ORIGINAL.mp4 -c:v libvpx-vp9 -b:v 0 -crf 30 -pass 1 -an -f null /dev/null && ffmpeg -i ARQUIVO_ORIGINAL.mp4 -c:v libvpx-vp9 -b:v 0 -crf 30 -pass 2 -c:a libopus ARQUIVO_CONVERTIDO.webm
    • Explicando (mais ou menos):
      • -c:v libvpx-vp9 = codec usado para o encoding do vídeo
      • -b:v 0 = (acho) que define a taxa de bits do vídeo como constante
      • -crf 30 = a qualidade do encoding (de -1 a 63)
      • -pass 1 = indica que essa é a passagem (pass) 1 (serão feitas duas)
      • -an = desabilita o áudio (não precisamos dele na primeira passagem)
      • -f null /dev/null = faz com que o arquivo de destino seja um descritor nulo, o que vai gerar um arquivo de log que o ffmpeg vai usar na segunda passagem
      • && = operador lógico e – o comando após ele só sera executado se o comando anterior for executado sem erros
      • -pass 2 = indica que essa é a passagem (pass) 2
      • -c:a libopus = codec de áudio
 
   

Acabei de esbarrar com isso github.com/mifi/lossless-cut, um editor que é basicamente uma interface gráfica para o FFMPEG, bem na pegada do que eu tinha vontade de fazer. Ainda não testei, tenho que baixar o código, compilar e tal, coisas que não vai dar pra fazer ao menos nos próximos dias, mas lembrei daqui e quis trazer. Parece que também não tem uma precisão de frame muito boa (github.com/mifi/lossless-cut/issues/330), mas se eu entendi mais ou menos o problema, exportando para um codec intraframe (como o ProRes) deve resolver.