Bagaimana menemukan bingkai per detik dari file video apa pun?

44

Apakah ada cara sederhana untuk menemukan fps video di ubuntu? Di windows saya menggunakan Gspot untuk mengetahui semua informasi tentang file video. Tetapi di ubuntu saya merasa sangat sulit untuk mengetahui informasi dasar ini. Bantuan apa pun dihargai.

Vivek
sumber
Ini tidak mungkin, karena tidak semua file video memiliki "fps" (karena ada penyandian VFR).
fkraiem
Video VFR masih memiliki frame rate rata-rata - apakah ini berguna atau tidak tergantung pada aplikasi.
thomasrutter

Jawaban:

47

Ini akan memberi tahu Anda framerate jika itu bukan framerate variabel:

ffmpeg -i nama file

Output sampel dengan nama file dikaburkan:

Masukan # 0, matroska, webm, dari 'somerandom.mkv':
  Durasi: 01: 16: 10.90, mulai: 0,000000, bitrate: N / A
    Streaming # 0,0: Video: h264 (Tinggi), yuv420p, 720x344 [PAR 1: 1 DAR 90:43], 25 fps, 25 tbr, 1k tbn, 50 tbc (default)
    Streaming # 0.1: Audio: aac, 48000 Hz, stereo, s16 (default)
ffmpeg -i nama file 2> & 1 | sed -n "s /.*, \ (. * *) fp. * / \ 1 / p"

Seseorang diedit dengan yang tidak bekerja seperti yang saya inginkan. Ini direferensikan di sini.
Edit tambahan ... Jika Anda ingin nilai tbr, sed line ini berfungsi

sed -n "s /.*, \ (. * *) tbr. * / \ 1 / p"
RobotHumans
sumber
Saya perlu menggunakan tb bukan fp dalam satu-liner. Sepertinya tidak semua file video melaporkan fps tetapi semua autput sesuatu seperti tbr tbc yang memiliki nilai yang sama.
sup
valid, tetapi satu-liner dari edit output-ed nilai tbc bukan nilai tbr dalam set output tertentu. sesuatu untuk dipertimbangkan mengapa saya mengubahnya ... Saya lebih suka gagal dengan cara yang benar-benar terlihat daripada cara yang tidak diperhatikan sama sekali.
RobotHumans
Saya pikir sed -n "s/.*, \(.*\) tbr.*/\1/prindu "pada akhirnya, bukan?
sup
6
ffmpeg tidak ditinggalkan, avconv berasal dari cabang ffmpeg dan untuk menghindari kebingungan bagi mereka yang menggunakan alternatif ffmpeg, cabang palsu ditandai sebagai ditinggalkan untuk memberi tahu para pengguna bahwa versi yang mereka gunakan berubah. komentar Anda menyesatkan dan dapat menyebabkan pengguna membuang waktu untuk meneliti hal ini
Chris
1
Bagaimana jika itu frame rate variabel?
0xcaff
29
ffprobe -v 0 -of csv=p=0 -select_streams v:0 -show_entries stream=r_frame_rate infile

Hasil:

2997/100
Steven Penny
sumber
3
Ini mungkin jawaban terbaik karena memberikan frame rate EXACT (dalam contoh 24000/1001 = 23,976023976)
ntg
1
terkadang saya mendapatkan 0/0tergantung pada format
Daniel_L
1
Tergantung pada apa yang Anda inginkan, ini berfungsi atau tidak. Ini melaporkan framerate dari encoding, tetapi bukan framerate sebenarnya dari video. Misalnya, video 30fps yang dikodekan ke dalam 60fps akan melaporkan 60fps tetapi masih akan menjadi 30fps dalam output aktual.
Harvey
8
Ini tidak berfungsi jika aliran video bukan aliran pertama, Anda akan mendapatkan 0/0 jika terlihat pada aliran audio. Saya akan mengedit untuk dimasukkan -select_streams V:0, yang akan memilih aliran video bergerak pertama.
Sam Watkins
2
@Komplemen SamWatkins penting. Tanpa itu, perintah diberikan output 0/0.
jdhao
4

Berikut adalah fungsi python berdasarkan jawaban Steven Penny menggunakan ffprobe yang memberikan frame rate yang tepat

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
ntg
sumber
2

Alternatif untuk baris perintah, adalah melihat properti file Anda melalui menu konteks di Nautilus (manajer file grafis). Untuk file audio / video Anda mendapatkan tab tambahan di sana dengan informasi tambahan.

pengguna32288
sumber
2

Ini adalah skrip python untuk melakukan ini menggunakan mplayer, kalau-kalau ada yang tertarik. Digunakan path/to/script path/to/movie_name1 path/to/movie/name2dll

#!/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
sup
sumber
0

Anda dapat mengklik kanan file target, Properties, Audio / Video tetapi Anda tidak akan mendapatkan framerate yang tepat. Untuk mendapatkan framerate yang tepat, Anda dapat menginstal MediaInfo.

vladmateinfo
sumber
0

Untuk berjaga-jaga seandainya seseorang menemukan ini ... Anda tentu saja dapat menggunakan input arg sebagai path;)

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)))
Apa
sumber
0

Saya biasanya menggunakan exiftooluntuk mendapatkan info dari semua jenis file ... Misalnya dengan perintah exiftool file.swfsaya dapat mengetahui framerate dari file swf apa pun, sesuatu yang tidak dapat saya capai denganffmpeg

aesede
sumber
-1
ffprobe <media> 2>&1| grep ",* fps" | cut -d "," -f 5 | cut -d " " -f 2
Daya
sumber
1
jelaskan apa yang akan dilakukannya?
rɑːdʒɑ