Obtenha informações do ffmpeg de maneira amigável

108

Cada vez que tento obter alguma informação sobre meus arquivos de vídeo com o ffmpeg, ele vomita muitas informações inúteis misturadas com coisas boas.

Estou usando ffmpeg -i name_of_the_video.mpg.

Existe alguma possibilidade de conseguir isso de uma forma amigável? Quer dizer, JSON seria ótimo (e mesmo um XML feio é bom).

Até agora, eu fiz meu aplicativo analisar os dados com regex, mas há muitos cantos desagradáveis ​​que aparecem em alguns arquivos de vídeo específicos. Consertei tudo o que encontrei, mas pode haver mais.

Eu queria algo como:

{
  "Stream 0": {
     "type": "Video",
     "codec": "h264",
     "resolution": "720x480"
  },
  "Stream 1": {
     "type": "Audio",
     "bitrate": "128 kbps",
     "channels": 2
  }
}
JBernardo
fonte
3
Você já deu uma olhada no ffprobe ? Parece fornecer uma saída legível JSON.
NT3RP de
Já li, mas não consegui encontrar o formato de saída JSON
JBernardo

Respostas:

292

Um pouco tarde, mas talvez ainda seja relevante para alguém ..

ffprobeé realmente um excelente caminho a percorrer. Observe, porém, que você precisa dizer ffprobequais informações deseja exibir (com as opções -show_format, -show_packetse -show_streams) ou ele apenas fornecerá uma saída em branco (como você mencionou em um de seus comentários).

Por exemplo, ffprobe -v quiet -print_format json -show_format -show_streams somefile.asfresultaria em algo como o seguinte:

{
  "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
fonte
1
Se alguém precisar, escrevi uma solução PHP baseada nessa resposta: stackoverflow.com/questions/11805207/…
Paulo Freitas
Desculpe por descobrir isso, mas há alguma chance de acelerar isso? Demora 5-6 segundos para mostrar a saída
mangia
Essa frase final é exatamente o que eu precisava. Obrigado :)
Matt Fletcher
5
pessoas ... fazer uma pergunta em um comentário a uma resposta de 4 anos atrás tem quase nenhuma chance de ser respondido ...
patrick
1
Você também pode usar em -of jsonvez de -print_format json. O primeiro é compatível, avprobeenquanto o último não.
Chih-Hsuan Yen
15

Agora é possível usar -progress -para imprimir informações amigáveis ​​formatadas por 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
fonte
3
Bom saber. Eu me pergunto por que isso não é mencionado nos documentos .
Duvrai
Isso é bom! O motivo de "-progress -" não ser mencionado nos documentos é porque "-" significa apenas canalizá-lo para stdout
Chris W
13

Você pode tentar ffprobe. O comando correto para obter a saída JSON deve ser parecido com o seguinte:

ffprobe ... -print_format json
NT3RP
fonte
2
Compilei o ffmpeg mais recente, mas a saída json do programa é apenas {}. Parece não funcionar com os arquivos de vídeo que tenho ...
JBernardo
2
@JBernardo Ei, caso alguém mais se depare com isso, você tem que fazer -print_format em vez de -of ou então ele vai apenas fazer uma saída de impressão muito inútil {... normal aqui ...}, veja a resposta aceita para um exemplo de linha de comando
mgrandi
0

Outro uso ffprobeque é bem analisável:

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

resulta em:

h264x600x480x25/1x385.680000x542326

-select_streams v:0seleciona apenas o fluxo de vídeo. Se você remover esse parâmetro, obterá uma linha para cada fluxo.

yglodt
fonte