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. P>
4 Réponses :
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. P>
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. P>
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}");
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 .
Cette commande bash fonctionne comme un charme (testé):
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
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) " Code>
ECHO $ $ FORMAT_DARGER> TMP.TXT >
ECHO / 2 >> TMP.TXT CODE>
DOS2UNIX TMP.TXT code> format_duration =
tr -d '\ n'
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 code> renvoie un numéro sans le premier zéro, par ex.
.987 Code>, qui provoque une erreur d'erreur:
Spécification de la durée non valide pour SS: 0,987 code>. Il semble que plus de zéro dirigeant supplémentaire soit ok pour
ss code>, donc j'ajoute un
0 code> ici:
... -ss 0 "$ (BC ... code>. Voir aussi: