Primeiro de tudo, use sempre a versão mais recente do FFmpeg.
Se você tiver acesso ao PHP, sua pergunta será respondida com perfeição no Stack Overflow: Use o FFMpeg para obter o quadro intermediário de um vídeo?
$output = shell_exec("/usr/local/bin/ffmpeg -i {$path}");
preg_match('/Duration: ([0-9]{2}):([0-9]{2}):([^ ,])+/', $output, $matches);
$time = str_replace("Duration: ", "", $matches[0]);
$time_breakdown = explode(":", $time);
$total_seconds = round(($time_breakdown[0]*60*60) + ($time_breakdown[1]*60) + $time_breakdown[2]);
shell_exec("/usr/local/bin/ffmpeg -y -i {$path} -f mjpeg -vframes 1 -ss " . ($total_seconds / 2) . " -s {$w}x{$h} {$output_filename}";
O que ele fará é apenas extrair a duração da saída do FFmpeg e usá-la para determinar o timecode do quadro intermediário.
Você pode facilmente adaptar isso a outros shells e simplesmente inserir no seguinte comando, onde o quadro do meio está aproximadamente em 534
segundos:
ffmpeg -y -i input.mp4 -f mjpeg -vframes 1 -ss 534 thumbnail.jpg
Você sempre pode alterar o tamanho com -s 480x320
ou similar, dependendo do tamanho desejado, inserido em algum lugar após a opção -i input.mp4
.
A solução acima é um pouco imprecisa. Ele lhe dará imediatamente um resultado, mas você não pode especificar qual quadro deseja. Se você já conhece o quadro exato que deseja extrair, use o filtro select
, por exemplo, com o número de quadros 12345
:
ffmpeg -i input.mp4 -filter:v select="eq(n\,12345)" -vframes 1 thumbnail.jpg
Observe que esse comando pode demorar um pouco, já que ele precisa pular para o quadro especificado antes de extraí-lo.