Supondo que você execute * nix e Bash, baixe uma compilação estática do ffmpeg para o seu sistema operacional. Em seguida, pegue o arquivo ffmpeg
e copie-o para /usr/bin/ffmpeg
.
sudo cp ~/Downloads/ffmpeg/ffmpeg /usr/bin/ffmpeg
sudo chmod +x /usr/bin/ffmpeg
Agora você pode executar este script de shell no Bash - deve ser suficiente para copiá-lo e colá-lo na pasta onde estão os vídeos.
for f in *.mp4; do
duration=$(ffmpeg -i "$f" 2>&1 | grep "Duration"| cut -d ' ' -f 4 | sed s/,//)
length=$(echo "$duration" | awk '{ split($1, A, ":"); print 3600*A[1] + 60*A[2] + A[3] }' )
trim_start=20
trim_end=$(echo "$length" - 30 - "$trim_start" | bc)
echo ffmpeg -ss "$trim_start" -i "$f" -c copy -map 0 -t "$trim_end" "${f%.mp4}-trimmed.mp4"
done
Observação: remova a instrução echo
para realmente executar os comandos. Seria bom testar primeiro os comandos gerados para precisão. Isso geraria algo como:
ffmpeg -ss 20 -i input.mp4 -c copy -map 0 -t 161.58 input-trimmed.mp4
O que o script fará é calcular o tempo total de execução da entrada, subtrair a hora de início e a hora que você deseja remover do final e, então, instruir o ffmpeg a fazer uma cópia de fluxo de sua hora de início especificada para a horário final recém-calculado. Isso não irá prejudicar a qualidade de vídeo e áudio de qualquer forma. Ele deve ser executado em menos de alguns segundos, mesmo para arquivos grandes.
Para esclarecer, -ss
define a hora de início e -c copy -map 0
copiará todos os fluxos de vídeo, áudio e legenda da versão original para a versão reduzida. -t
define a hora final. Veja este artigo no Wiki do FFmpeg para mais informações sobre como buscar.