Nhận thông tin ffmpeg một cách thân thiện


108

Mỗi khi tôi cố gắng lấy một số thông tin về các tệp video của mình bằng ffmpeg, nó sẽ tạo ra rất nhiều thông tin vô ích xen lẫn những thứ tốt đẹp.

Tôi đang sử dụng ffmpeg -i name_of_the_video.mpg.

Có bất kỳ khả năng nào để đạt được điều đó một cách thân thiện? Ý tôi là JSON sẽ rất tuyệt (và thậm chí XML xấu cũng được).

Bây giờ, tôi đã tạo ứng dụng của mình phân tích cú pháp dữ liệu bằng regex nhưng có rất nhiều góc khó chịu xuất hiện trên một số tệp video cụ thể. Tôi đã sửa tất cả những gì tôi gặp phải, nhưng có thể còn nhiều hơn thế.

Tôi muốn một cái gì đó như:

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

3
Bạn đã xem qua ffprobe chưa? Nó dường như cung cấp một đầu ra JSON có thể đọc được.
NT3RP

Tôi đã xem qua nó rồi nhưng không thể tìm thấy định dạng đầu ra JSON
JBernardo 10/10/11

Câu trả lời:


292

Hơi muộn nhưng có lẽ vẫn còn phù hợp với ai đó ..

ffprobethực sự là một cách tuyệt vời để đi. Lưu ý, tuy nhiên, bạn cần phải nói với ffprobenhững thông tin nào bạn muốn nó hiển thị (với -show_format, -show_packets-show_streamstùy chọn) hoặc nó sẽ chỉ cung cấp cho bạn sản lượng trống (như bạn đề cập trong một trong những bình luận của bạn).

Ví dụ, ffprobe -v quiet -print_format json -show_format -show_streams somefile.asfsẽ mang lại một cái gì đó như sau:

{
  "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
Nếu ai đã từng cần, tôi đã viết một giải pháp PHP dựa trên câu trả lời rằng: stackoverflow.com/questions/11805207/...
Paulo Freitas

Xin lỗi vì đã đào ra điều này, nhưng có cơ hội nào để tăng tốc độ này không? Phải mất 5-6 giây để hiển thị đầu ra
Mangia

Câu cuối cùng đó chính là điều tôi cần. Cảm ơn :)
Matt Fletcher

5
người ... hỏi một câu hỏi trong một chú thích cho câu trả lời từ 4 năm trước đây đã về zero cơ hội nhận được trả lời ...
patrick

1
Bạn cũng có thể sử dụng -of jsonthay thế -print_format json. Cái trước tương thích với avprobetrong khi cái sau thì không.
Chih-Hsuan Yen

15

Bây giờ có thể sử dụng -progress -để in thông tin thân thiện được định dạng bởi 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
Tốt để biết. Tôi tự hỏi tại sao điều này không được đề cập trong tài liệu .
Duvrai 21/09/18

Điều này là tốt! Lý do "-progress -" không được đề cập trong tài liệu là vì "-" chỉ có nghĩa là chuyển nó thành stdout
Chris W

13

Bạn có thể thử ffprobe. Lệnh chính xác để nhận đầu ra JSON sẽ giống như sau:

ffprobe ... -print_format json

2
Tôi đã biên dịch ffmpeg mới nhất nhưng chỉ có đầu ra json của chương trình {}. Nó không dường như làm việc với các tập tin video tôi có ...
JBernardo

2
@JBernardo Xin chào, trong trường hợp bất kỳ ai khác gặp phải vấn đề này, bạn phải thực hiện -print_format thay vì -of nếu không nó sẽ chỉ tạo ra một bản in rất vô ích {... ở đây ...}, hãy xem câu trả lời được chấp nhận cho một ví dụ dòng lệnh
mgrandi

0

Một cách sử dụng khác ffprobecó thể phân tích cú pháp độc đáo:

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

kết quả trong:

h264x600x480x25/1x385.680000x542326

-select_streams v:0chỉ chọn luồng video. Nếu bạn xóa thông số đó, bạn sẽ nhận được một dòng cho mỗi luồng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.