Làm thế nào để tìm khung hình mỗi giây của bất kỳ tập tin video?


44

Có cách nào đơn giản để tìm fps của video trong ubfox không? Trong windows tôi sử dụng Gspot để tìm hiểu tất cả thông tin về một tệp video. Nhưng trong ubfox tôi thấy rất khó để tìm ra thông tin cơ bản này. Bất kỳ trợ giúp được đánh giá cao.


Điều này là không thể, bởi vì không phải tất cả các tệp video đều có "fps" (vì mã hóa VFR tồn tại).
fkraiem

Các video VFR vẫn có tốc độ khung hình trung bình - việc này có hữu ích hay không phụ thuộc vào ứng dụng.
thomasrutter

Câu trả lời:


47

Điều này sẽ cho bạn biết tốc độ khung hình nếu nó không phải là tốc độ khung hình:

tên tệp ffmpeg -i

Đầu ra mẫu với tên tệp bị che khuất:

Đầu vào # 0, matroska, webm, từ 'somerandom.mkv':
  Thời lượng: 01: 16: 10,90, bắt đầu: 0,000000, bitrate: Không áp dụng
    Luồng # 0,0: Video: h264 (Cao), yuv420p, 720x344 [PAR 1: 1 DAR 90:43], 25 khung hình / giây, 25 tbr, 1k tbn, 50 tbc (mặc định)
    Luồng # 0,1: Âm thanh: aac, 48000 Hz, âm thanh nổi, s16 (mặc định)
ffmpeg -i tên tệp 2> & 1 | sed -n "s /.*, \ (. * \) fp. * / \ 1 / p"

Ai đó đã chỉnh sửa với một cái không hoạt động theo cách tôi muốn. Nó được tham chiếu ở đây
Chỉnh sửa bổ sung ... Nếu bạn muốn giá trị tbr thì dòng sed này hoạt động

sed -n "s /.*, \ (. * \) tbr. * / \ 1 / p"

Tôi cần sử dụng tb thay vì fp trong một lớp lót. Có vẻ như không phải tất cả các tệp video báo cáo fps nhưng tất cả đều tự động xác định một cái gì đó như tbr tbc có cùng giá trị.
sup

hợp lệ, nhưng một lớp lót từ đầu ra chỉnh sửa-ed giá trị tbc không phải là giá trị tbr trong bộ đầu ra cụ thể này. một cái gì đó để xem xét lý do tại sao tôi thay đổi nó ... Tôi thà thất bại theo cách thực sự đáng chú ý hơn là một cách hoàn toàn không được chú ý.
RobotHumans

Tôi nghĩ sed -n "s/.*, \(.*\) tbr.*/\1/pbỏ lỡ "cuối cùng, không?
sup

6
ffmpeg không bị phản đối, avconv đến từ một nhánh của ffmpeg và để tránh nhầm lẫn cho những người sử dụng thay thế ffmpeg, nhánh giả được đánh dấu là không dùng để cho những người dùng đó biết rằng phiên bản họ đang sử dụng đang thay đổi. Nhận xét của bạn là sai lệch và có thể khiến người dùng lãng phí thời gian nghiên cứu về điều này
Chris

1
Điều gì nếu nó là tốc độ khung hình thay đổi?
0xcaff

29
ffprobe -v 0 -of csv=p=0 -select_streams v:0 -show_entries stream=r_frame_rate infile

Kết quả:

2997/100

3
Đây có lẽ là câu trả lời tốt nhất ở chỗ nó cho phép tỷ lệ khung hình chính xác (trong ví dụ 24000/1001 = 23,976023976)
NTG

1
đôi khi tôi nhận được 0/0tùy thuộc vào định dạng
Daniel_L

1
Tùy thuộc vào những gì bạn muốn, điều này có thể hoạt động hoặc không. Nó báo cáo tốc độ khung hình của mã hóa, nhưng không phải là tốc độ khung hình thực tế của video. Ví dụ: video 30fps được mã hóa thành 60fps sẽ báo cáo 60fps nhưng vẫn sẽ là 30fps trong sản lượng thực tế.
Harvey

8
Điều này không hoạt động nếu luồng video không phải là luồng đầu tiên, bạn sẽ nhận được 0/0 nếu nó nhìn vào luồng âm thanh. Tôi sẽ chỉnh sửa để đặt -select_streams V:0, sẽ chọn luồng video di chuyển đầu tiên.
Sam Watkins

2
@ Bổ sung của SamWatkins là quan trọng. Không có nó, lệnh cho đầu ra 0/0.
jdhao

4

Đây là một hàm python dựa trên câu trả lời của Steven Penny bằng cách sử dụng ffprobe cho tốc độ khung hình chính xác

ffprobe 'Upstream Color 2013 1080p x264.mkv' -v 0 -select_streams v -print_format flat -show_entries stream=r_frame_rate
import sys
import os
import subprocess
def get_frame_rate(filename):
    if not os.path.exists(filename):
        sys.stderr.write("ERROR: filename %r was not found!" % (filename,))
        return -1         
    out = subprocess.check_output(["ffprobe",filename,"-v","0","-select_streams","v","-print_format","flat","-show_entries","stream=r_frame_rate"])
    rate = out.split('=')[1].strip()[1:-1].split('/')
    if len(rate)==1:
        return float(rate[0])
    if len(rate)==2:
        return float(rate[0])/float(rate[1])
    return -1

2

Thay thế cho dòng lệnh, đang xem xét các thuộc tính của tệp của bạn thông qua menu ngữ cảnh trong Nautilus (trình quản lý tệp đồ họa). Đối với các tệp âm thanh / video, bạn nhận được một tab bổ sung ở đó với thông tin bổ sung.


2

Đây là một kịch bản python để làm điều này bằng cách sử dụng mplayer, trong trường hợp bất cứ ai quan tâm. Nó được sử dụng path/to/script path/to/movie_name1 path/to/movie/name2vv

#!/usr/bin/python
# -*- coding: utf-8 -*-

import subprocess
import re
import sys

pattern = re.compile(r'(\d{2}.\d{3}) fps')
for moviePath in sys.argv[1:]:
    mplayerOutput = subprocess.Popen(("mplayer", "-identify", "-frames", "0", "o-ao", "null", moviePath), stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()[0]
    fps = pattern.search(mplayerOutput).groups()[0]
    print fps

0

Bạn có thể nhấp chuột phải vào tệp mục tiêu, Thuộc tính, Âm thanh / Video nhưng bạn sẽ không nhận được tốc độ khung hình chính xác. Để có được tốc độ khung hình chính xác, bạn có thể cài đặt MediaInfo.


0

Chỉ trong trường hợp ai đó vấp phải điều này ... tất nhiên bạn có thể sử dụng đầu vào arg làm đường dẫn;)

import numpy as np
import os
import subprocess

def getFramerate():
    con = "ffprobe -v error -select_streams v:0 -show_entries stream=avg_frame_rate -of default=noprint_wrappers=1:nokey=1 D:\\Uni\\Seminar\\leecher\\Ninja\\stream1.mp4"

    proc = subprocess.Popen(con, stdout=subprocess.PIPE, shell=True)
    framerateString = str(proc.stdout.read())[2:-5]
    a = int(framerateString.split('/')[0])
    b = int(framerateString.split('/')[1])
    return int(np.round(np.divide(a,b)))

0

Tôi thường sử dụng exiftoolđể lấy thông tin của bất kỳ loại tệp nào ... Ví dụ với lệnh exiftool file.swftôi có thể biết tốc độ khung hình của bất kỳ tệp swf nào, một cái gì đó tôi không thể đạt được vớiffmpeg


-1
ffprobe <media> 2>&1| grep ",* fps" | cut -d "," -f 5 | cut -d " " -f 2

1
giải thích nó sẽ làm gì?
rdʒɑ
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.