รับข้อมูล ffmpeg อย่างเป็นมิตร


109

ทุกครั้งที่ฉันพยายามหาข้อมูลเกี่ยวกับไฟล์วิดีโอของฉันด้วย ffmpeg มันจะมีข้อมูลที่ไร้ประโยชน์มากมายผสมกับสิ่งดีๆ

ฉันกำลังใช้ ffmpeg -i name_of_the_video.mpg .

มีความเป็นไปได้ที่จะได้รับสิ่งนั้นอย่างเป็นมิตรหรือไม่? ฉันหมายความว่า JSON จะดีมาก (และแม้กระทั่ง XML ที่น่าเกลียดก็ใช้ได้)

ตอนนี้ฉันทำให้แอปพลิเคชันของฉันแยกวิเคราะห์ข้อมูลด้วย regex แต่มีมุมที่น่ารังเกียจมากมายที่ปรากฏในไฟล์วิดีโอบางไฟล์ ฉันแก้ไขทุกสิ่งที่ฉันพบ แต่อาจมีมากกว่านั้น

ฉันต้องการสิ่งที่ชอบ:

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

3
คุณเคยดูffprobeหรือยัง? ดูเหมือนว่าจะให้เอาต์พุตที่อ่านได้ JSON
NT3RP

ฉันหลับไปแล้ว แต่ไม่พบรูปแบบเอาต์พุต JSON
JBernardo

คำตอบ:


294

สายไปหน่อย แต่อาจจะยังเกี่ยวข้องกับใครบางคน ..

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/…
Paulo Freitas

ขออภัยที่ขุดออกมา แต่มีโอกาสเร่งได้หรือไม่? ใช้เวลา 5-6 วินาทีในการแสดงผลลัพธ์
mangia

ประโยคสุดท้ายนั่นคือสิ่งที่ฉันต้องการ ขอบคุณ :)
Matt Fletcher

5
คน ... การถามคำถามในความคิดเห็นต่อคำตอบเมื่อ 4 ปีก่อนมีโอกาสได้รับคำตอบเป็นศูนย์ ...
patrick

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 -" ไม่ได้กล่าวถึงในเอกสารเป็นเพราะ "-" เพียงแค่หมายความว่าต่อไปนี้เป็น 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เลือกเฉพาะสตรีมวิดีโอ หากคุณลบพารามิเตอร์นั้นคุณจะได้หนึ่งบรรทัดสำหรับแต่ละสตรีม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.