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.

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top