Ottieni informazioni ffmpeg in modo amichevole


108

Ogni volta che provo a ottenere alcune informazioni sui miei file video con ffmpeg, vomita molte informazioni inutili mescolate con cose buone.

Sto usando ffmpeg -i name_of_the_video.mpg.

Ci sono possibilità per ottenerlo in modo amichevole? Voglio dire che JSON sarebbe fantastico (e anche il brutto XML va bene).

Ormai, ho fatto in modo che la mia applicazione analizzi i dati con regex ma ci sono molti angoli sgradevoli che appaiono su alcuni file video specifici. Ho risolto tutto ciò che ho riscontrato, ma potrebbe essercene di più.

Volevo qualcosa del tipo:

{
  "Stream 0": {
     "type": "Video",
     "codec": "h264",
     "resolution": "720x480"
  },
  "Stream 1": {
     "type": "Audio",
     "bitrate": "128 kbps",
     "channels": 2
  }
}

3
Hai dato un'occhiata a ffprobe ? Sembra fornire un output leggibile JSON.
NT3RP

L'ho già letto, ma non sono riuscito a trovare il formato di output JSON
JBernardo

Risposte:


292

Un po 'in ritardo, ma forse ancora rilevante per qualcuno ..

ffprobeè davvero un ottimo modo per andare. Si noti, però, che è necessario indicare ffprobele informazioni che si desidera visualizzare (con la -show_format, -show_packetse -show_streamsopzioni), oppure sarà solo si dà uscita vuota (come si parla in uno dei vostri commenti).

Ad esempio, ffprobe -v quiet -print_format json -show_format -show_streams somefile.asfprodurrebbe qualcosa di simile al seguente:

{
  "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
Se qualcuno ne avesse bisogno, ho scritto una soluzione PHP basata su quella risposta: stackoverflow.com/questions/11805207/…
Paulo Freitas

Scusa per aver scoperto questo, ma c'è qualche possibilità per accelerarlo? Ci vogliono 5-6 secondi per mostrare l'output
mangia

Quella frase finale è esattamente ciò di cui avevo bisogno. Grazie :)
Matt Fletcher

5
persone ... fare una domanda in un commento a una risposta di 4 anni fa ha circa zero possibilità di ottenere risposta ...
patrick

1
Puoi anche usare al -of jsonposto di -print_format json. Il primo è compatibile con avprobeil secondo no.
Chih-Hsuan Yen

15

Ora è possibile utilizzare -progress -per stampare informazioni amichevoli formattate da 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
Buono a sapersi. Mi chiedo perché questo non sia menzionato nei documenti .
Duvrai

Questo è buono! Il motivo per cui "-progress -" non è menzionato nei documenti è perché "-" significa semplicemente pipe a stdout
Chris W

13

Potresti provare ffprobe. Il comando corretto per ottenere l'output JSON dovrebbe essere simile al seguente:

ffprobe ... -print_format json

2
Ho compilato l'ultimo ffmpeg ma l'output json del programma è solo {}. Non sembra funzionare con i file video che ho ...
JBernardo

2
@ JBernardo Ehi, nel caso qualcun altro si imbatta in questo, devi fare -print_format piuttosto che -o altrimenti farà solo un inutile {... output di stampa normale qui ...}, vedi la risposta accettata per un riga di comando di esempio
mgrandi

0

Un altro utilizzo del ffprobequale è ben analizzabile:

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

risultati in:

h264x600x480x25/1x385.680000x542326

-select_streams v:0seleziona solo il flusso video. Se rimuovi quel parametro, ottieni una riga per ogni flusso.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.