Uzyskaj informacje ffmpeg w przyjazny sposób


108

Za każdym razem, gdy próbuję uzyskać informacje o moich plikach wideo za pomocą ffmpeg, wymiotuje wiele bezużytecznych informacji zmieszanych z dobrymi rzeczami.

Używam ffmpeg -i name_of_the_video.mpg.

Czy są jakieś możliwości, aby to zrobić w przyjazny sposób? Mam na myśli, że JSON byłby świetny (a nawet brzydki XML jest w porządku).

Do tej pory wykonałem moją aplikację analizując dane za pomocą wyrażenia regularnego, ale jest wiele nieprzyjemnych zakrętów, które pojawiają się w niektórych określonych plikach wideo. Naprawiłem wszystko, co napotkałem, ale może być więcej.

Chciałem coś takiego:

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

3
Czy spojrzałeś na ffprobe ? Wydaje się, że zapewnia czytelne dane wyjściowe JSON.
NT3RP

Już się temu przyjrzałem, ale nie mogłem znaleźć formatu wyjściowego JSON
JBernardo

Odpowiedzi:


292

Trochę późno, ale może nadal dla kogoś istotne ...

ffprobeto rzeczywiście doskonały sposób. Uwaga jednak, że trzeba powiedzieć ffprobe, jakie informacje chcesz go wyświetlić (z -show_format, -show_packetsi -show_streamsopcje), bo to po prostu daje pusty wyjście (jak wspomina w jednym z komentarzy).

Na przykład ffprobe -v quiet -print_format json -show_format -show_streams somefile.asfdałoby coś takiego:

{
  "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
Jeśli ktoś kiedykolwiek potrzebował, napisałem rozwiązanie PHP oparte na tej odpowiedzi: stackoverflow.com/questions/11805207/ ...
Paulo Freitas

Przepraszam, że to wykopałem, ale czy jest jakaś szansa, aby to przyspieszyć? Wyświetlenie wyniku zajmuje 5-6 sekund
mangia

To ostatnie zdanie jest dokładnie tym, czego potrzebowałem. Dzięki :)
Matt Fletcher

5
ludzie ... zadając pytanie w komentarzu do odpowiedzi sprzed 4 lat ma prawie zerową szansę na odpowiedź ...
patrick

1
Możesz także użyć -of jsonzamiast -print_format json. Pierwsza z nich jest kompatybilna, avprobea druga nie.
Chih-Hsuan Yen

15

Teraz można użyć -progress -do wydrukowania przyjaznych informacji sformatowanych przez 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
Dobrze wiedzieć. Zastanawiam się, dlaczego to nie jest wymienione w dokumentach .
Duvrai,

To jest dobre! Powodem, dla którego „-progress -” nie jest wymieniony w dokumentach, jest to, że „-” oznacza po prostu przesyłanie go na standardowe wyjście
Chris W

13

Mógłbyś spróbować ffprobe. Prawidłowe polecenie uzyskania danych wyjściowych JSON powinno wyglądać następująco:

ffprobe ... -print_format json

2
Skompilowałem najnowszą ffmpeg, ale wyjście json programu jest tylko {}. Wygląda na to, że nie działa z plikami wideo, które mam ...
JBernardo,

2
@JBernardo Hej, na wypadek, gdyby ktoś inny wpadł w to, musisz zrobić -print_format zamiast -of, bo inaczej zrobi to bardzo nieprzydatne {... normalne wydrukowanie tutaj ...}, zobacz akceptowaną odpowiedź na przykładowa linia poleceń
mgrandi

0

Inne użycie, ffprobektóre można ładnie przeanalizować:

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

prowadzi do:

h264x600x480x25/1x385.680000x542326

-select_streams v:0wybiera tylko strumień wideo. Jeśli usuniesz ten parametr, otrzymasz jedną linię dla każdego strumienia.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.