Erhalten Sie ffmpeg-Informationen auf freundliche Weise

108

Jedes Mal, wenn ich versuche, mit ffmpeg Informationen über meine Videodateien abzurufen, werden viele nutzlose Informationen mit guten Dingen vermischt.

Ich benutze ffmpeg -i name_of_the_video.mpg.

Gibt es irgendwelche Möglichkeiten, das auf freundliche Weise zu bekommen? Ich meine, JSON wäre großartig (und selbst hässliches XML ist in Ordnung).

Inzwischen habe ich meine Anwendung dazu gebracht, die Daten mit Regex zu analysieren, aber es gibt viele unangenehme Ecken, die in bestimmten Videodateien angezeigt werden. Ich habe alles behoben, was mir begegnet ist, aber es kann noch mehr geben.

Ich wollte so etwas wie:

{
  "Stream 0": {
     "type": "Video",
     "codec": "h264",
     "resolution": "720x480"
  },
  "Stream 1": {
     "type": "Audio",
     "bitrate": "128 kbps",
     "channels": 2
  }
}
JBernardo
quelle
3
Haben Sie sich ffprobe angesehen ? Es scheint eine JSON-lesbare Ausgabe bereitzustellen.
NT3RP
Ich habe es mir bereits angesehen, konnte aber das JSON-Ausgabeformat nicht finden
JBernardo

Antworten:

292

Ein bisschen spät, aber vielleicht immer noch relevant für jemanden ..

ffprobeist in der Tat ein ausgezeichneter Weg. Beachten Sie jedoch, dass Sie sagen müssen , ffprobewelche Informationen Sie es (mit der angezeigt werden soll -show_format, -show_packetsund -show_streamsOptionen) oder es werden Sie nur leere Ausgabe geben (wie Sie in einem Ihrer Kommentare erwähnen).

Zum Beispiel ffprobe -v quiet -print_format json -show_format -show_streams somefile.asfwürde so etwas ergeben:

{
  "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
quelle
1
Wenn jemand jemals braucht, habe ich eine PHP-Lösung basierend auf dieser Antwort geschrieben: stackoverflow.com/questions/11805207/…
Paulo Freitas
Tut mir leid, dass ich das ausgegraben habe, aber gibt es eine Chance, dies zu beschleunigen? Es dauert 5-6 Sekunden, um die Ausgabe zu zeigen
Mangia
Dieser letzte Satz ist genau das, was ich brauchte. Danke :)
Matt Fletcher
5
Leute ... eine Frage in einem Kommentar zu einer Antwort von vor 4 Jahren zu stellen, hat ungefähr keine Chance, beantwortet zu werden ...
Patrick
1
Sie können auch -of jsonanstelle von verwenden -print_format json. Ersteres ist kompatibel mit avprobeletzterem nicht.
Chih-Hsuan Yen
15

Jetzt ist es möglich, -progress -freundliche Informationen zu drucken, die von formatiert sind 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
quelle
3
Gut zu wissen. Ich frage mich, warum dies in den Dokumenten nicht erwähnt wird .
Duvrai
Das ist gut! Der Grund, warum das "-progress -" in den Dokumenten nicht erwähnt wird, ist, dass "-" nur bedeutet, es an stdout weiterzuleiten
Chris W
13

Du könntest es versuchen ffprobe. Der richtige Befehl zum Abrufen der JSON-Ausgabe sollte wie folgt aussehen:

ffprobe ... -print_format json
NT3RP
quelle
2
Ich habe das neueste ffmpeg kompiliert, aber die json-Ausgabe des Programms ist nur {}. Es scheint nicht mit den Videodateien zu funktionieren, die ich habe ...
JBernardo
2
@JBernardo Hey, falls jemand anderes darauf stößt, musst du -print_format anstatt -of ausführen, sonst wird nur eine sehr wenig hilfreiche {... normale Druckausgabe hier ...} ausgeführt, siehe die akzeptierte Antwort für eine Beispiel Befehlszeile
mgrandi
0

Eine andere Verwendung ffprobedavon ist gut analysierbar:

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

Ergebnisse in:

h264x600x480x25/1x385.680000x542326

-select_streams v:0wählt nur den Videostream aus. Wenn Sie diesen Parameter entfernen, erhalten Sie eine Zeile für jeden Stream.

yglodt
quelle