Отримуйте інформацію про ffmpeg доброзичливо


108

Кожен раз, коли я намагаюсь отримати якусь інформацію про мої відеофайли за допомогою ffmpeg, вона викликає багато непотрібної інформації, змішаної з хорошими речами.

Я використовую ffmpeg -i name_of_the_video.mpg.

Чи є якісь можливості отримати це дружньо? Я маю на увазі, що JSON буде чудовим (і навіть некрасивий XML - це добре).

На сьогоднішній день я зробив свою програму для аналізу даних за допомогою регулярних виразів, але є багато неприємних куточків, які з'являються на деяких конкретних відеофайлах. Я виправив усе, що зіткнувся, але може бути і більше.

Я хотів чогось типу:

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

3
Ви поглянули на ffprobe ? Схоже, це забезпечує результат для читання JSON.
NT3RP

Я вже шукав це, але не міг знайти вихідний формат JSON
JBernardo

Відповіді:


292

Трохи пізно, але, можливо, все ще стосується когось ..

ffprobeце справді відмінний шлях. Зауважимо, однак, що ви повинні сказати , ffprobeяку інформацію ви хочете, щоб відобразити (з -show_format, -show_packetsі -show_streamsваріанти) , або це буде просто дати вам порожній висновок (як ви згадуєте в одному з ваших коментарів).

Наприклад, ffprobe -v quiet -print_format json -show_format -show_streams somefile.asfможна отримати щось подібне:

{
  "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
Якщо комусь колись знадобиться, я написав PHP-рішення на основі цієї відповіді: stackoverflow.com/questions/11805207/…
Пауло Фрейтас

Вибачте, що викопали це, але чи є шанс прискорити це? На показ результату потрібно 5-6 секунд
мангія

Це заключне речення саме те, що мені було потрібно. Дякую :)
Метт Флетчер

5
люди ... задаючи питання в коментарі до відповіді 4 років тому, є приблизно нульовий шанс отримати відповідь ...
Патрік

1
Ви також можете використовувати -of jsonзамість -print_format json. Перший сумісний, avprobeа другий - ні.
Chih-Hsuan Yen

15

Тепер це можливо використовувати -progress -для друку дружньої інформації, відформатованої 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
Добре знати. Цікаво, чому це не згадується в документах .
Дуврай

Це добре! Причина "-progress -" в документах не згадується в тому, що "-" означає лише передачу її в stdout
Chris W

13

Ви можете спробувати ffprobe. Правильна команда для отримання виводу JSON має виглядати наступним чином:

ffprobe ... -print_format json

2
Я склав найновіший ffmpeg, але вихід json програми є лише {}. Схоже, це не працює з відеофайлами, які у мене є ...
JBernardo

2
@JBernardo Ей, якщо хтось інший зіткнеться з цим, вам доведеться зробити -print_format, а не -of, інакше це буде просто дуже корисно {... нормальний вихід друку тут ...}, див. Прийняту відповідь на Приклад командного рядка
mgrandi

0

Інше використання, ffprobeяке добре аналізується:

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

призводить до:

h264x600x480x25/1x385.680000x542326

-select_streams v:0вибирає лише відеопотік. Якщо ви видалите цей параметр, ви отримаєте один рядок для кожного потоку.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.