Ffmpeg bilgilerini dostane bir şekilde alın


108

Ne zaman ffmpeg ile video dosyalarım hakkında biraz bilgi almaya çalışsam, iyi şeylerle karıştırılmış pek çok yararsız bilgiyi kusar.

Kullanıyorum ffmpeg -i name_of_the_video.mpg.

Bunu dostane bir şekilde elde etmenin herhangi bir olasılığı var mı? Yani JSON harika olurdu (ve çirkin XML bile iyi olabilir).

Şimdiye kadar, uygulamamın verileri regex ile ayrıştırmasını sağladım, ancak bazı belirli video dosyalarında görünen çok sayıda kötü köşe var. Karşılaştığım her şeyi düzelttim ama daha fazlası olabilir.

Şöyle bir şey istedim:

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

3
Ffprobe'a bir göz attınız mı? JSON tarafından okunabilir bir çıktı sağlıyor gibi görünüyor.
NT3RP

Zaten baktım ama JSON çıktı formatını bulamadım
JBernardo

Yanıtlar:


292

Biraz geç, ama yine de birisiyle alakalı ..

ffprobegerçekten de mükemmel bir yol. Not olsa da, sen söylemem gereken ffprobebunu görüntülemek istediğiniz (hangi bilgileri -show_format, -show_packetsve -show_streamsseçenekler) ya da (eğer yorumların birinde söz gibi) sadece size boş çıktı vereceğiz.

Örneğin ffprobe -v quiet -print_format json -show_format -show_streams somefile.asf, aşağıdaki gibi bir şey verir:

{
  "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
İhtiyaç duyan olursa, o cevaba dayalı bir PHP çözümü yazdım: stackoverflow.com/questions/11805207/…
Paulo Freitas

Bunu kazıp çıkardığım için üzgünüm ama bunu hızlandırmak için herhangi bir şans var mı? Çıktının gösterilmesi 5-6 saniye sürer
mangia

Bu son cümle tam da ihtiyacım olan şeydi. Teşekkürler :)
Matt Fletcher

5
insanlar ... 4 yıl önceki bir cevaba yorumda soru sormanın cevaplanma şansı yaklaşık sıfır ...
patrick

1
Bunun -of jsonyerine de kullanabilirsiniz -print_format json. İlki ile uyumlu avprobeiken ikincisi uyumlu değildir.
Chih-Hsuan Yen

15

Artık -progress -tarafından biçimlendirilmiş kolay bilgiler yazdırmak için kullanmak mümkündür 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
Bunu bildiğim iyi oldu. Dokümanlarda neden bundan bahsedilmediğini merak ediyorum .
Duvrai

Bu iyi! Dokümanlarda "-progress -" ifadesinden bahsedilmemesinin nedeni, "-" sadece onu stdout'a yönlendirmek anlamına gelmesidir
Chris W

13

Deneyebilirsin ffprobe. JSON çıktısını almak için doğru komut aşağıdaki gibi görünmelidir:

ffprobe ... -print_format json

2
En yeni ffmpeg'i derledim ama programın json çıktısı sadece {}. Sahip olduğum video dosyalarıyla çalışmıyor gibi görünüyor ...
JBernardo

2
@JBernardo Hey, başka biri bununla karşılaşırsa, -of yerine -print_format yapmanız gerekir, yoksa bu sadece çok yararsızdır {... normal baskı çıktısı burada ...}, kabul edilen cevaba bakın örnek komut satırı
mgrandi

0

Güzel bir ffprobeşekilde ayrıştırılabilir başka bir kullanımı :

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

sonuçlanır:

h264x600x480x25/1x385.680000x542326

-select_streams v:0yalnızca video akışını seçer. Bu parametreyi kaldırırsanız, her akış için bir satır alırsınız.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.