Est-ce que quelqu'un sait comment récupérer le nombre total d'images à partir d'un fichier vidéo en utilisant ffmpeg? La sortie de rendu de ffmpeg montre l'image actuelle et j'ai besoin du nombre d'images pour calculer la progression en pourcentage.
112
Réponses:
Remarque: la présence d'une liste de montage dans MP4 / M4V / M4A / MOV peut affecter votre numéro d'image. Voir Modifier les listes ci - dessous.
ffprobe: interroger le conteneur
N/A
. Consultez les autres méthodes répertoriées ci-dessous.ffprobe: compte le nombre d'images
-skip_frame nokey
option permettant de ne compter que les images clés.ffmpeg: compte le nombre d'images
Si vous n'en avez pas,
ffprobe
vous pouvez utiliser à laffmpeg
place:frame=
la fin de la sortie de la console.-discard nokey
option d'entrée (avant-i
) pour ne compter que les images clés.Modifier les listes
Ignorez la liste d'édition MP4 / M4V / M4A / MOV avec l'
-ignore_editlist 1
option d'entrée. La valeur par défaut est de ne pas ignorer la liste d'édition.Ce que signifient les options ffprobe
-v error
Cela masque la sortie "info" (informations de version, etc.), ce qui facilite l'analyse.-count_frames
Comptez le nombre d'images par flux et signalez-le dans la section de flux correspondante.-select_streams v:0
Sélectionnez uniquement le flux vidéo.-show_entries stream=nb_frames
ou-show_entries stream=nb_read_frames
Afficher uniquement l'entrée pournb_frames
ounb_read_frames
.-of default=nokey=1:noprint_wrappers=1
Définissez le format de sortie (alias le "rédacteur") surdefault
, n'imprimez pas la clé de chaque champ (nokey=1
) et n'imprimez pas l'en-tête et le pied de page de la section (noprint_wrappers=1
). Il existe des alternatives plus courtes telles que-of csv=p=0
.Regarde aussi
mediainfo
L'
mediainfo
outil bien connu peut afficher le nombre d'images:MP4Box
Pour les fichiers MP4 / M4V / M4A.
MP4Box
de gpac peut afficher le nombre d'images:Reportez-vous à la
Media Info
ligne dans la sortie pour le flux vidéo en question:Dans cet exemple, le flux vidéo a 2525 images.
boxdumper
Pour les fichiers MP4 / M4V / M4A / MOV.
boxdumper
est un outil simple de l-smash. Il produira une grande quantité d'informations. Dans lastsz
section de la zone de taille de l' échantillon, reportez-vous ausample_count
nombre de cadres. Dans cet exemple, l'entrée a 1900 images vidéo:stsz
atome.la source
ffprobe -v error -select_streams v:0 -show_entries stream=nb_frames -of default=nokey=1:noprint_wrappers=1 input.mkv
Sous Unix, cela fonctionne comme du charme:
la source
ffmpeg -i 00000.avi -map 0:v:0 -c copy -f null -y /dev/null 2>&1 | grep -Eo 'frame= *[0-9]+ *' | grep -Eo '[0-9]+' | tail -1
Calculez-le plutôt en fonction du temps.
C'est ce que je fais et cela fonctionne très bien pour moi, et bien d'autres.) Tout d'abord, recherchez la longueur de la vidéo dans l'extrait ci-dessous:
Vous devriez être en mesure de trouver de manière cohérente et sûre
Duration: hh:mm:ss.nn
la taille du clip vidéo source. Ensuite, pour chaque ligne de mise à jour (CR, pas de LF), vous pouvez analyser le texte pour la marque d'heure actuelle où il se trouve:Veillez simplement à ne pas toujours vous attendre à une sortie parfaite de ces lignes d'état. Ils peuvent inclure des messages d'erreur comme ici:
Une fois que vous avez le temps, il est mathématique simple:
time / durration * 100 = % done
.la source
TimeSpan
partir de celui-ci, puis de l'utilisercurrentDurationTimeSpan.Ticks / (totalDurationTimeSpan.Ticks / 100)
. Le TimeSpan fournit également une fonction d'analyse puissante, vérifiez-leTous les formats ne stockent pas leur nombre d'images ou leur durée totale - et même s'ils le font, le fichier peut être incomplet - donc ffmpeg ne détecte aucun d'eux avec précision par défaut.
Au lieu de cela, essayez de chercher jusqu'à la fin du fichier et lisez l'heure, puis comptez l'heure actuelle pendant que vous y allez.
Alternativement, vous pouvez essayer
AVFormatContext->nb_index_entries
la durée détectée, qui devrait fonctionner correctement au moins en bon état AVI / MOV, ou la bibliothèque FFMS2, qui est probablement trop lente à déranger pour une barre de progression.la source
Essayez quelque chose comme:
Il écrit le numéro de l'image dans stderr, vous pouvez donc récupérer la dernière image à partir de celui-ci.
la source
Vous pouvez utiliser
ffprobe
pour obtenir le numéro d'image avec les commandes suivantesffprobe.exe -i video_name -print_format json -loglevel fatal -show_streams -count_frames -select_streams v
qui disent d'imprimer les données au
json
formatselect_streams v
vous diraffprobe
de nous donner simplement desvideo
données de flux et si vous les supprimez, cela vous donnera également desaudio
informationset la sortie sera comme
2. vous pouvez utiliser
qui vous donnera des données de flux, si vous voulez des informations sélectionnées comme la fréquence d'images, utilisez la commande suivante
qui donnent une base numérique sur les informations de votre vidéo, le problème est que lorsque vous utilisez cette méthode, il est possible que vous obteniez un
N/A
sortie.pour plus d'informations, consultez cette page Conseils FFProbe
la source
essaye ça:
la source
*.ts
. La sortie est une ligne vide.Étant donné que mon commentaire a reçu quelques votes positifs, j'ai pensé que je le laisserais comme réponse:
Cela devrait être rapide, car aucun encodage n'est effectué.
ffmpeg
démultiplexera simplement le fichier et lira (décodera) le premier flux vidéo aussi rapidement que possible. La premièregrep
commande saisira le texte qui montre le cadre. La deuxièmegrep
commande ne prendra que le nombre de cela. Latail
commande affichera simplement la dernière ligne (décompte final des images).la source
pour construire sur la réponse de stu. voici comment j'ai trouvé la fréquence d'images d'une vidéo à partir de mon téléphone portable. j'ai exécuté la commande suivante pendant un moment. Je laisse le nombre d'images atteindre environ ~ 10000 avant de m'impatienter et d'appuyer sur ^ C:
puis, j'ai attrapé deux informations de cette ligne qui commence par "frame =", le nombre d'images, 7989, et l'heure, 00: 04: 26.30. Vous devez d'abord convertir le temps en secondes, puis diviser le nombre d'images par secondes pour obtenir des «images par seconde». "images par seconde" est votre fréquence d'images.
le framerate pour ma vidéo est de 30 fps.
la source
La seule précision que j'ai pu faire est la suivante:
Pour vous assurer que cela fonctionne avec la vidéo:
la source
ffprobe -i my_video.mp4 -show_frames 2>&1 | grep -c media_type=video
Désolé pour la réponse necro, mais peut-être en aura-t-il besoin (car je n'ai pas trouvé de solution pour les dernières versions de ffmpeg.
Avec ffmpeg 3.3.4, j'en ai trouvé un avec ce qui suit:
À la fin, il affichera le nombre de trames. Cela a fonctionné pour moi sur des vidéos avec audio. Cela donne deux fois une ligne "nb_frames", cependant, mais la première ligne était le nombre réel d'images sur les vidéos que j'ai testées.
la source
J'utilise le php_ffmpeg alors je peux obtenir toutes les heures et toutes les images d'un film. Comme belows
Et puis le détail est sur la page.
http://ffmpeg-php.sourceforge.net/doc/api/ffmpeg_movie.php
la source
la source
Linux
rubis
la source