Получите информацию о 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
  }
}
JBernardo
источник
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 секунд
mangia
Это последнее предложение - именно то, что мне нужно. Спасибо :)
Мэтт Флетчер
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
Хорошо знать. Интересно, почему об этом не упоминается в документации .
Duvrai
Это хорошо! Причина, по которой «-progress -» не упоминается в документации, заключается в том, что «-» просто означает перенаправить его на стандартный вывод
Крис В.
13

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

ffprobe ... -print_format json
NT3RP
источник
2
Я скомпилировал новейший ffmpeg, но вывод программы только в формате json {}. Похоже, это не работает с имеющимися у меня видеофайлами ...
JBernardo
2
@JBernardo Эй, на случай, если кто-то еще столкнется с этим, вы должны сделать -print_format, а не -of, иначе он будет просто бесполезен {... нормальный вывод здесь ...}, см. Принятый ответ для пример командной строки
mgrandi 01
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выбирает только видеопоток. Если вы удалите этот параметр, вы получите по одной строке для каждого потока.

Иглодт
источник