Use FFMpeg para obter moldura meio de um vídeo?
Pergunta
Eu estou querendo saber como usar FFMpeg para grap o quadro do meio de um vídeo. Eu já escrevi o C # para agarrar um quadro em um determinado momento (ou seja puxar um fotograma de segunda 3). Mas eu ainda tenho que descobrir como encontrar o meio de vídeo usando os comandos FFMpeg.
Solução
Esta poderia ser simplificado, mas aqui está um código PHP velho que eu tinha em torno de mentir que deve fazer o truque. (Adicione o local para ffmpeg se ele não está em seu caminho)
$output = shell_exec("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("ffmpeg -y -i {$path} -f mjpeg -vframes 1 -ss " . ($total_seconds / 2) . " -s {$w}x{$h} {$output_filename}");
Outras dicas
FFmpeg ajuda a obter o framerate ea duração do vídeo, para que possa multiplicar um pelo outro e dividir por 2 para obter o número do quadro do meio.
ou seja, para um vídeo de 30 segundos rodando a 15 quadros por segundo:. 30 * 15 = 450/2 = 225, ou seja, você precisa agarrar a moldura 225
Com um simples script shell você pode usar ffprobe
para obter uma máquina legível saída de duração, bc
para calcular o ponto meia, e ffmpeg
para fazer a moldura:
input=input.mp4; ffmpeg -ss "$(bc -l <<< "$(ffprobe -loglevel error -of csv=p=0 -show_entries format=duration "$input")*0.5")" -i "$input" -frames:v 1 half.png
Isso elimina qualquer necessidade de PHP, echo
, awk
, tr
, grep
, sed
, etc.
Este comando bash funciona como um encanto (testado):
avconv -i 'in.mpg' -vcodec mjpeg -vframes 1 -an -f rawvideo -s 420x300 -ss avconv -i in.mpg 2>&1 | grep Duration | awk '{print $2}' | tr -d , | awk -F ':' '{print ($3+$2*60+$1*3600)/2}' out.jpg