Utilisez ffmpeg pour obtenir cadre milieu d'une vidéo?
Question
Je me demande comment utiliser ffmpeg pour grap le cadre milieu d'une vidéo. Je l'ai déjà écrit le C # pour saisir un cadre à un certain moment (c.-à-tirer une image à la seconde 3). Mais je n'ai pas encore à comprendre comment trouver au milieu de la vidéo en utilisant les commandes FFMpeg.
La solution
Cela pourrait être simplifiée, mais voici quelques vieux code PHP que j'avais couché autour qui devrait faire l'affaire. (Ajouter l'emplacement à FFmpeg si ce n'est pas dans votre chemin)
$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}");
Autres conseils
FFmpeg vous aide à obtenir le framerate et la longueur de la vidéo, de sorte que vous pouvez multiplier l'un par l'autre et diviser par 2 pour obtenir le numéro du cadre central.
par exemple pour une course vidéo de 30 secondes à 15 images par seconde: 30 * 15 = 450/2 = 225, ce qui signifie que vous devez saisir le cadre 225e
. Avec les scripts shell simple que vous pouvez utiliser pour obtenir une ffprobe
la machine sortie de durée lisible, pour calculer le bc
demi-point, et pour faire le ffmpeg
cadre:
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
Ceci élimine tout besoin de PHP, echo
, awk
, tr
, grep
, sed
, etc.
Cette commande bash fonctionne comme un charme (testé):
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