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.

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top