Comment trouver des images par seconde d'un fichier vidéo?

44

Existe-t-il un moyen simple de trouver les images par seconde d'une vidéo dans Ubuntu? Dans Windows, j'utilise Gspot pour trouver toutes les informations sur un fichier vidéo. Mais à Ubuntu, je trouve très difficile de trouver cette information de base. Toute aide est appréciée.

Vivek
la source
Cela n’est pas possible car tous les fichiers vidéo n’ont pas de "fps" (car le codage VFR existe).
fkraiem
Les vidéos VFR ont toujours une cadence moyenne - son utilité dépend de l'application.
thomasrutter

Réponses:

47

Cela vous indiquera le nombre d'images par seconde si ce n'est pas variable:

ffmpeg -i nomfichier

Exemple de sortie avec le nom de fichier masqué:

Entrée n ° 0, matroska, webm, de 'somerandom.mkv':
  Durée: 01: 16: 10.90, début: 0.000000, débit: N / A
    Flux # 0.0: Vidéo: h264 (Elevé), yuv420p, 720x344 [PAR 1: 1 DAR 90:43], 25 ips, 25 tbr, 1 000 milliards de baht, 50 tbc (par défaut)
    Flux # 0.1: Audio: aac, 48000 Hz, stéréo, s16 (par défaut)
ffmpeg -i nom_fichier 2> & 1 | sed -n "s /.*, \ (. * \) fp. * / \ 1 / p"

Quelqu'un a édité avec un qui ne fonctionnait pas vraiment comme je le voulais. C'est référencé ici
Édition supplémentaire ... Si vous voulez la valeur tbr cette ligne sed fonctionne

sed -n "s /.*, \ (. * \) tbr. * / \ 1 / p"
RobotHumans
la source
Je devais utiliser tb au lieu de fp dans le one-liner. Il ne semble pas que tous les fichiers vidéo signalent des images par seconde, mais ils utilisent tous comme quelque chose comme tbr tbc qui a la même valeur.
Sup
valide, mais le one-liner de l'éditeur édite la valeur tbc et non la valeur tbr dans cet ensemble particulier de sorties. Il ya quelque chose à considérer sur la raison pour laquelle je l’ai changée ... Je préférerais qu’elle échoue de manière vraiment perceptible plutôt que de manière négligée.
RobotHumans
Je pense qu'il sed -n "s/.*, \(.*\) tbr.*/\1/pmanque "à la fin, non?
Sup
6
ffmpeg n'est pas obsolète, avconv est issu d'une branche de ffmpeg et afin d'éviter toute confusion pour ceux qui utilisent l'alternative ffmpeg, la branche fausse a été marquée comme étant déconseillée pour indiquer aux utilisateurs que la version qu'ils utilisaient était en train de changer. votre commentaire est trompeur et pourrait amener les utilisateurs à perdre du temps à les rechercher
Chris
1
Et si c'est un taux de trame variable?
0xcaff
29
ffprobe -v 0 -of csv=p=0 -select_streams v:0 -show_entries stream=r_frame_rate infile

Résultat:

2997/100
Steven Penny
la source
3
C’est probablement la meilleure réponse dans la mesure où elle donne la cadence EXACT (dans l’exemple 24000/1001 = 23.976023976)
2016
1
Parfois, je reçois en 0/0fonction du format
Daniel_L
1
Selon ce que vous voulez, cela fonctionne ou non. Il indique le nombre d'images par seconde de l'encodage, mais pas le nombre d'images par seconde de la vidéo. Par exemple, une vidéo à 30 images par seconde encodée en 60 images par seconde indiquera 60 images par seconde, mais restera toujours à 30 images par seconde en sortie réelle.
Harvey
8
Cela n'a pas fonctionné si le flux vidéo n'est pas le premier flux, vous obtiendrez 0/0 s'il ressemble à un flux audio. Je vais éditer pour mettre -select_streams V:0, ce qui sélectionnera le premier flux vidéo en mouvement.
Sam Watkins
2
Le complément de @ SamWatkins est important. Sans cela, la commande donnée en sortie 0/0.
jdhao
4

Voici une fonction python basée sur la réponse de Steven Penny en utilisant ffprobe qui donne une fréquence d'images exacte

ffprobe 'Upstream Color 2013 1080p x264.mkv' -v 0 -select_streams v -print_format flat -show_entries stream=r_frame_rate
import sys
import os
import subprocess
def get_frame_rate(filename):
    if not os.path.exists(filename):
        sys.stderr.write("ERROR: filename %r was not found!" % (filename,))
        return -1         
    out = subprocess.check_output(["ffprobe",filename,"-v","0","-select_streams","v","-print_format","flat","-show_entries","stream=r_frame_rate"])
    rate = out.split('=')[1].strip()[1:-1].split('/')
    if len(rate)==1:
        return float(rate[0])
    if len(rate)==2:
        return float(rate[0])/float(rate[1])
    return -1
ntg
la source
2

L’alternative à la ligne de commande consiste à examiner les propriétés de votre fichier via le menu contextuel de Nautilus (gestionnaire de fichiers graphique). Pour les fichiers audio / vidéo, vous obtenez un onglet supplémentaire contenant des informations supplémentaires.

utilisateur32288
la source
2

Ceci est un script python pour faire cela en utilisant mplayer, au cas où quelqu'un serait intéressé. Il est utilisé path/to/script path/to/movie_name1 path/to/movie/name2etc

#!/usr/bin/python
# -*- coding: utf-8 -*-

import subprocess
import re
import sys

pattern = re.compile(r'(\d{2}.\d{3}) fps')
for moviePath in sys.argv[1:]:
    mplayerOutput = subprocess.Popen(("mplayer", "-identify", "-frames", "0", "o-ao", "null", moviePath), stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()[0]
    fps = pattern.search(mplayerOutput).groups()[0]
    print fps
souper
la source
0

Vous pouvez cliquer avec le bouton droit sur le fichier cible, Propriétés, Audio / Vidéo, mais vous n'obtiendrez pas le nombre d'images par seconde exact. Pour obtenir un framerate précis, vous pouvez installer MediaInfo.

vladmateinfo
la source
0

Juste au cas où quelqu'un tomberait dessus ... vous pouvez bien sûr utiliser input arg comme chemin;)

import numpy as np
import os
import subprocess

def getFramerate():
    con = "ffprobe -v error -select_streams v:0 -show_entries stream=avg_frame_rate -of default=noprint_wrappers=1:nokey=1 D:\\Uni\\Seminar\\leecher\\Ninja\\stream1.mp4"

    proc = subprocess.Popen(con, stdout=subprocess.PIPE, shell=True)
    framerateString = str(proc.stdout.read())[2:-5]
    a = int(framerateString.split('/')[0])
    b = int(framerateString.split('/')[1])
    return int(np.round(np.divide(a,b)))
WhatAMesh
la source
0

J'utilise généralement exiftoolpour obtenir des informations sur tous les types de fichiers ... Par exemple, avec la commande, exiftool file.swfje peux connaître le framerate de n'importe quel fichier swf, ce que je ne peux pas obtenir avecffmpeg

Aesede
la source
-1
ffprobe <media> 2>&1| grep ",* fps" | cut -d "," -f 5 | cut -d " " -f 2
Daya
la source
1
expliquer ce qu'il va faire?
rɑːdʒɑ