10
votes

Utilisez FFMPEG pour obtenir un cadre moyen d'une vidéo?

Je me demande comment utiliser FFMPEG pour grapper le cadre moyen d'une vidéo. J'ai déjà écrit le C # pour saisir un cadre à un moment donné (c.-à-d. Tirer une image à la deuxième 3). Mais je dois encore savoir comment trouver le milieu de la vidéo à l'aide des commandes FFMPEG.


0 commentaires

4 Réponses :


4
votes

FFMPEG vous aide à obtenir le framerate et la longueur de la vidéo, de sorte que vous pouvez la multiplier par l'autre et diviser par 2 pour obtenir le numéro du cadre intermédiaire.

Ie pendant une vidéo de 30 secondes fonctionnant à 15 images par seconde: 30 * 15 = 450/2 = 225, ce qui signifie que vous devez saisir la 225ème image.


0 commentaires

11
votes

Cela pourrait être simplifié, mais voici quelques vieux code PHP que j'avais couché autour de cela devrait faire l'affaire. (Ajoutez 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}");   


2 commentaires

Merci, c'est ce que je cherchais!


@Derek Gathright, donnez-moi des détails de base pour commencer à travailler avec FFMPEG. Veuillez regarder mon Question .



-1
votes

Cette commande bash fonctionne comme un charme (testé): xxx


0 commentaires

8
votes

avec des scripts de shell simples Vous pouvez utiliser FFProbe code> pour obtenir une sortie de durée lisible par machine, BC code> pour calculer le demi-point et ffmpeg code> à Faire le 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


4 commentaires

Sous Windows / Cygwin, je devais faire un traitement de texte de karge laids de la sortie de EVAL / FFPROBE pour éliminer une nouvelle ligne de Windows à partir de la fin de $ format_duration: eval "$ (Erreur FFProbe -V -of plat = S = _ -Show_entries Format = Durée TMP.mp4) " ECHO $ ​​$ FORMAT_DARGER> TMP.TXT ECHO / 2 >> TMP.TXT DOS2UNIX TMP.TXT format_duration = tr -d '\ n' Si quelqu'un connaît un moyen plus élégant d'utiliser $ format_duration sur Windows, je serais heureux de le savoir.


Il y a un ensemble de backticks entourant l'affectation variable après le format_duration dans la dernière partie de mon commentaire (qui est éliminé ici par analyse de markdown).


J'aimerais pouvoir avoir suscité plus. Merci pour le simple double doublure.


Si la vidéo est inférieure à deux secondes de long, bc renvoie un numéro sans le premier zéro, par ex. .987 , qui provoque une erreur d'erreur: Spécification de la durée non valide pour SS: 0,987 . Il semble que plus de zéro dirigeant supplémentaire soit ok pour ss , donc j'ajoute un 0 ici: ... -ss 0 "$ (BC ... . Voir aussi: Unix.stackexchange.com/questions/197896/...