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
  }
}

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"
    }
  }
}

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

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

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.