วิธีค้นหาเฟรมต่อวินาทีของไฟล์วิดีโอใด ๆ


44

มีวิธีง่ายๆในการค้นหา fps ของวิดีโอใน Ubuntu หรือไม่? ใน windows ฉันใช้ Gspot เพื่อค้นหาข้อมูลทั้งหมดเกี่ยวกับไฟล์วิดีโอ แต่ในอูบุนตูฉันพบว่ามันยากมากที่จะหาข้อมูลพื้นฐานนี้ ความช่วยเหลือใด ๆ ที่ชื่นชม


ไม่สามารถทำได้เนื่องจากไฟล์วิดีโอบางไฟล์ไม่มี "fps" (เนื่องจากมีการเข้ารหัส VFR อยู่)
fkraiem

วิดีโอ VFR ยังคงมีอัตราเฟรมเฉลี่ยไม่ว่าจะมีประโยชน์หรือไม่นั้นขึ้นอยู่กับแอปพลิเคชัน
thomasrutter

คำตอบ:


47

สิ่งนี้จะบอกให้คุณทราบถึงอัตราเฟรมถ้ามันไม่ใช่ตัวแปรเฟรม:

ffmpeg -i ชื่อไฟล์

เอาต์พุตตัวอย่างที่มีชื่อไฟล์ถูกบดบัง:

ป้อน # 0, matroska, webm, จาก 'somerandom.mkv':
  ระยะเวลา: 01: 16: 10.90, เริ่มต้น: 0.000000, บิตเรต: N / A
    สตรีม # 0.0: วิดีโอ: h264 (สูง), yuv420p, 720x344 [PAR 1: 1 DAR 90:43], 25 fps, 25 tbr, 1k tbn, 50 tbc (ค่าเริ่มต้น)
    สตรีม # 0.1: เสียง: aac, 48000 Hz, สเตอริโอ, s16 (ค่าเริ่มต้น)
ffmpeg -i ชื่อไฟล์ 2> & 1 | sed -n "s /.*, \ (. * \) fp. * / \ 1 / p"

มีคนแก้ไขข้อความที่ไม่ได้ผลตามที่ต้องการ มันมีการอ้างอิงที่นี่
แก้ไขเพิ่มเติม ... หากคุณต้องการค่า tbr สาย sed นี้ใช้งานได้

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

ฉันต้องการใช้ tb แทน fp ในหนึ่งซับ ดูเหมือนว่าไม่ใช่ไฟล์วิดีโอทั้งหมดที่รายงาน fps แต่การป้อนข้อมูลอัตโนมัติบางอย่างเช่น tbr tbc ซึ่งมีค่าเท่ากัน
sup

ใช้ได้ แต่ซับในจากการแก้ไขเอาต์พุต -ed ค่า tbc ไม่ใช่ค่า tbr ในชุดเอาต์พุตเฉพาะนี้ สิ่งที่ต้องพิจารณาเกี่ยวกับสาเหตุที่ฉันเปลี่ยนมัน ... ฉันค่อนข้างจะล้มเหลวในแบบที่เห็นได้ชัดเจนกว่าวิธีที่ไม่สังเกตเลย
RobotHumans

ฉันคิดว่าsed -n "s/.*, \(.*\) tbr.*/\1/pคิดถึง"ในท้ายที่สุดไม่?
sup

6
ffmpeg ไม่ได้ถูกปฏิเสธ avconv มาจากสาขาของ ffmpeg และเพื่อหลีกเลี่ยงความสับสนสำหรับผู้ที่ใช้ ffmpeg ทางเลือกสาขาปลอมถูกทำเครื่องหมายว่าเลิกใช้เพื่อให้ผู้ใช้ทราบว่ารุ่นที่พวกเขากำลังใช้กำลังเปลี่ยนแปลง ความคิดเห็นของคุณทำให้เข้าใจผิดและอาจทำให้ผู้ใช้เสียเวลาค้นคว้าสิ่งนี้
Chris

1
เกิดอะไรขึ้นถ้ามันเป็นอัตราเฟรมตัวแปร
0xcaff

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

ผลลัพธ์:

2997/100

3
นี่อาจเป็นคำตอบที่ดีที่สุดที่จะให้อัตราเฟรมที่แน่นอน (ในตัวอย่าง 24000/1001 = 23.976023976)
ntg

1
บางครั้งฉันก็0/0ขึ้นอยู่กับรูปแบบ
Daniel_L

1
ขึ้นอยู่กับสิ่งที่คุณต้องการสิ่งนี้อาจใช้ได้หรือไม่ มันรายงานอัตราเฟรมของการเข้ารหัส แต่ไม่ใช่อัตราเฟรมที่แท้จริงของวิดีโอ ตัวอย่างเช่นวิดีโอ 30fps ที่เข้ารหัสเป็น 60fps จะรายงาน 60fps แต่จะยังคงเป็น 30fps ในเอาต์พุตจริง
ฮาร์วีย์

8
ไม่สามารถใช้งานได้หากสตรีมวิดีโอไม่ใช่สตรีมแรกคุณจะได้รับ 0/0 หากดูสตรีมเสียง ฉันจะแก้ไขเพื่อใส่-select_streams V:0ซึ่งจะเลือกวิดีโอสตรีมที่ย้ายเป็นครั้งแรก
Sam Watkins

2
@ ส่วนประกอบของ SamWatkins เป็นสิ่งสำคัญ 0/0ก็ไม่มีคำสั่งให้เอาท์พุท
jdhao

4

นี่คือฟังก์ชั่นไพ ธ อนตามคำตอบของ Steven Penny โดยใช้ ffprobe ที่ให้อัตราเฟรมที่แน่นอน

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

ทางเลือกอื่นสำหรับบรรทัดคำสั่งคือดูคุณสมบัติของไฟล์ของคุณผ่านเมนูบริบทใน Nautilus (ตัวจัดการไฟล์กราฟิก) สำหรับไฟล์เสียง / วิดีโอคุณจะได้รับแท็บเพิ่มเติมที่นั่นพร้อมข้อมูลเพิ่มเติม


2

นี่เป็นสคริปต์ไพ ธ อนโดยใช้ mplayer ในกรณีที่ใคร ๆ ก็สนใจ มันถูกใช้path/to/script path/to/movie_name1 path/to/movie/name2ฯลฯ

#!/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

คุณสามารถคลิกขวาที่ไฟล์เป้าหมาย, คุณสมบัติ, เสียง / วิดีโอ แต่คุณจะไม่ได้รับอัตราเฟรมที่แน่นอน เพื่อให้ได้อัตราเฟรมที่แม่นยำคุณสามารถติดตั้ง MediaInfo


0

ในกรณีที่มีคนสะดุดเมื่อนี้ ... คุณสามารถใช้คำสั่ง ARG เป็นเส้นทางได้)

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

ฉันมักจะใช้exiftoolเพื่อรับข้อมูลประเภทไฟล์ใด ๆ ... ตัวอย่างเช่นคำสั่งที่exiftool file.swfฉันสามารถรู้ framerate ของไฟล์ swf ใด ๆ สิ่งที่ฉันไม่สามารถทำได้ด้วยffmpeg


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