Dapatkan informasi ffmpeg dengan cara yang bersahabat

108

Setiap kali saya mencoba mendapatkan beberapa informasi tentang file video saya dengan ffmpeg, itu memuntahkan banyak informasi tidak berguna yang bercampur dengan hal-hal yang baik.

Saya menggunakan ffmpeg -i name_of_the_video.mpg.

Ada kemungkinan untuk mendapatkannya dengan cara yang bersahabat? Maksud saya JSON akan bagus (dan bahkan XML jelek juga bagus).

Sekarang, saya membuat aplikasi saya mengurai data dengan regex tetapi ada banyak sudut buruk yang muncul di beberapa file video tertentu. Saya memperbaiki semua yang saya temui, tetapi mungkin ada lebih banyak.

Saya menginginkan sesuatu seperti:

{
  "Stream 0": {
     "type": "Video",
     "codec": "h264",
     "resolution": "720x480"
  },
  "Stream 1": {
     "type": "Audio",
     "bitrate": "128 kbps",
     "channels": 2
  }
}
JBernardo
sumber
3
Sudahkah Anda melihat ffprobe ? Tampaknya menyediakan keluaran yang dapat dibaca JSON.
NT3RP
Saya sudah melihatnya tetapi tidak dapat menemukan format keluaran JSON
JBernardo

Jawaban:

292

Agak terlambat, tapi mungkin masih relevan untuk seseorang ..

ffprobememang cara terbaik untuk pergi. Namun, perhatikan bahwa Anda perlu memberi ffprobetahu informasi apa yang ingin Anda tampilkan (dengan opsi -show_format, -show_packetsdan -show_streams) atau itu hanya akan memberi Anda keluaran kosong (seperti yang Anda sebutkan di salah satu komentar Anda).

Misalnya, ffprobe -v quiet -print_format json -show_format -show_streams somefile.asfakan menghasilkan sesuatu seperti berikut:

{
  "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
sumber
1
Jika ada yang membutuhkan, saya telah menulis solusi PHP berdasarkan jawaban itu: stackoverflow.com/questions/11805207/…
Paulo Freitas
Maaf telah menggali ini, tetapi adakah kesempatan untuk mempercepat ini? Dibutuhkan 5-6 detik untuk menampilkan hasilnya
mangia
Kalimat terakhir itulah yang saya butuhkan. Terima kasih :)
Matt Fletcher
5
orang ... mengajukan pertanyaan dalam komentar untuk jawaban dari 4 tahun yang lalu memiliki kemungkinan nol untuk mendapatkan jawaban ...
patrick
1
Anda juga dapat menggunakan -of jsonbukan -print_format json. Yang pertama kompatibel dengan avprobeyang terakhir tidak.
Chih-Hsuan Yen
15

Sekarang dapat digunakan -progress -untuk mencetak info ramah yang diformat oleh 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
sumber
3
Senang mendengarnya. Saya bertanya-tanya mengapa ini tidak disebutkan di dokumen .
Duvrai
Ini bagus! Alasan "-progress -" tidak disebutkan dalam dokumen adalah karena "-" berarti menyalurkannya ke stdout
Chris W
13

Anda bisa mencoba ffprobe. Perintah yang benar untuk mendapatkan keluaran JSON akan terlihat seperti berikut:

ffprobe ... -print_format json
NT3RP
sumber
2
Saya mengkompilasi ffmpeg terbaru tetapi output json dari program ini hanya {}. Sepertinya tidak bekerja dengan file video yang saya miliki ...
JBernardo
2
@JBernardo Hai, jika ada orang lain yang mengalami ini, Anda harus melakukan -print_format daripada -of atau itu hanya akan melakukan {... keluaran cetak normal di sini ...}, lihat jawaban yang diterima untuk contoh baris perintah
mgrandi
0

Penggunaan lain ffprobeyang dapat diurai dengan baik:

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

menghasilkan:

h264x600x480x25/1x385.680000x542326

-select_streams v:0hanya memilih aliran video. Jika Anda menghapus parameter itu, Anda mendapatkan satu baris untuk setiap aliran.

yglodt
sumber