Obtenez des informations ffmpeg de manière conviviale

108

Chaque fois que j'essaie d'obtenir des informations sur mes fichiers vidéo avec ffmpeg, cela dégage beaucoup d'informations inutiles mélangées à de bonnes choses.

J'utilise ffmpeg -i name_of_the_video.mpg.

Y a-t-il des possibilités d'obtenir cela de manière amicale? Je veux dire que JSON serait génial (et même XML laid est bien).

À présent, j'ai fait que mon application analyse les données avec regex, mais il y a beaucoup de coins désagréables qui apparaissent sur certains fichiers vidéo spécifiques. J'ai corrigé tout ce que j'ai rencontré, mais il y en a peut-être plus.

Je voulais quelque chose comme:

{
  "Stream 0": {
     "type": "Video",
     "codec": "h264",
     "resolution": "720x480"
  },
  "Stream 1": {
     "type": "Audio",
     "bitrate": "128 kbps",
     "channels": 2
  }
}
JBernardo
la source
3
Avez-vous jeté un œil à ffprobe ? Il semble fournir une sortie lisible JSON.
NT3RP
Je l'ai déjà lu mais je n'ai pas pu trouver le format de sortie JSON
JBernardo

Réponses:

292

Un peu tard, mais peut-être toujours pertinent pour quelqu'un.

ffprobeest en effet une excellente façon de procéder. Notez cependant que vous devez indiquer ffprobeles informations que vous souhaitez afficher (avec les options -show_format, -show_packetset -show_streams), sinon cela vous donnera simplement une sortie vide (comme vous le mentionnez dans l'un de vos commentaires).

Par exemple, ffprobe -v quiet -print_format json -show_format -show_streams somefile.asfdonnerait quelque chose comme ce qui suit:

{
  "streams": [{
    "index": 0,
    "codec_name": "wmv3",
    "codec_long_name": "Windows Media Video 9",
    "codec_type": "video",
    "codec_time_base": "1/1000",
    "codec_tag_string": "WMV3",
    "codec_tag": "0x33564d57",
    "width": 320,
    "height": 240,
    "has_b_frames": 0,
    "pix_fmt": "yuv420p",
    "level": -99,
    "r_frame_rate": "30000/1001",
    "avg_frame_rate": "0/0",
    "time_base": "1/1000",
    "start_time": "0.000",
    "duration": "300.066",
    "tags": {
        "language": "eng"
    }
  }],
  "format": {
    "filename": "somefile.asf",
    "nb_streams": 1,
    "format_name": "asf",
    "format_long_name": "ASF format",
    "start_time": "0.000",
    "duration": "300.066",
    "tags": {
        "WMFSDKVersion": "10.00.00.3646",
        "WMFSDKNeeded": "0.0.0.0000",
        "IsVBR": "0"
    }
  }
}
Irexistus
la source
1
Si quelqu'un en a besoin, j'ai écrit une solution PHP basée sur cette réponse: stackoverflow.com/questions/11805207/...
Paulo Freitas
Désolé d'avoir creusé cela, mais y a-t-il une chance d'accélérer cela? Il faut 5-6 secondes pour afficher la sortie
mangia
Cette dernière phrase est exactement ce dont j'avais besoin. Merci :)
Matt Fletcher
5
people ... poser une question dans un commentaire à une réponse d'il y a 4 ans n'a à peu près aucune chance d'obtenir une réponse ...
patrick
1
Vous pouvez également utiliser à la -of jsonplace de -print_format json. Le premier est compatible avec avprobele second non.
Chih-Hsuan Yen
15

Il est maintenant possible d'utiliser -progress -pour imprimer des informations conviviales formatées par key=value.

ffmpeg  -i video.mp4 .......-s 1920x1080 -progress - -y out.mp4

speed=5.75x
frame=697
fps=167.7
stream_0_0_q=39.0
bitrate=2337.0kbits/s
total_size=6979778
out_time_ms=23893333
out_time=00:00:23.893333
dup_frames=0
drop_frames=0
Oleksandr Kyrpa
la source
3
Bon à savoir. Je me demande pourquoi cela n'est pas mentionné dans la documentation .
Duvrai
C'est bon! La raison pour laquelle le "-progress -" n'est pas mentionné dans la documentation est que "-" signifie simplement le diriger vers stdout
Chris W
13

Vous pourriez essayer ffprobe. La commande correcte pour obtenir la sortie JSON doit ressembler à ce qui suit:

ffprobe ... -print_format json
NT3RP
la source
2
J'ai compilé le dernier ffmpeg mais la sortie json du programme est seulement {}. Cela ne semble pas fonctionner avec les fichiers vidéo que j'ai ...
JBernardo
2
@JBernardo Hé, au cas où quelqu'un d'autre rencontrerait cela, vous devez faire -print_format plutôt que -of sinon cela fera juste une sortie d'impression très inutile {... ici ...}, voir la réponse acceptée pour un exemple de ligne de commande
mgrandi
0

Une autre utilisation ffprobeest bien analysable:

ffprobe -v error -select_streams v:0 -show_entries stream=width,height,r_frame_rate,bit_rate,codec_name,duration -of csv=p=0:s=x video.mp4

résulte en:

h264x600x480x25/1x385.680000x542326

-select_streams v:0sélectionne uniquement le flux vidéo. Si vous supprimez ce paramètre, vous obtenez une ligne pour chaque flux.

yglodt
la source