Ama*_*rus 43 video linux command-line framerate
我有一个视频文件,我想获取其中的视频帧数。我可以ffmpeg
用来获取视频的长度和 FPS。但是,对于总帧数,我看不到任何明显的东西。
从理论上讲,应该能够将长度(以秒为单位)乘以 FPS 以获得帧数,但在这种情况下,长度(34.43 秒)和帧速率(29.97 fps)给出了一个非整数,这让我认为我做错了什么。
我需要能够以完全自动化和非图形方式在命令行上执行此操作。我还需要这个非常准确,而不是估计(如果视频文件甚至可能)
我尝试tcprobe
在一些文件上使用。对于某些 AVI 文件,它可以工作,但对于某些 VOB 文件,tcprobe 输出没有帧数。我得到这个输出:
[tcprobe] MPEG program stream (PS)
[tcprobe] summary for myfile.vob, (*) = not default, 0 = not detected
import frame size: -g 720x480 [720x576] (*)
aspect ratio: 4:3 (*)
frame rate: -f 29.970 [25.000] frc=4 (*)
PTS=2199.3972, frame_time=33ms bitrate=7000 kbps
audio track: -a 0 [0] -e 48000,16,5 [48000,16,2] -n 0x2000 [0x2000] (*)
PTS=2199.2763, bitrate=192 kbps
-D 3 --av_fine_ms 20 (frames & ms) [0] [0]
Run Code Online (Sandbox Code Playgroud)
Aft*_*ock 43
ffprobe
可用于获取有关媒体文件的信息:
ffprobe -select_streams v -show_streams input.avi
Run Code Online (Sandbox Code Playgroud)
您将获得有关流的详细信息:
nb_frames=159697
Run Code Online (Sandbox Code Playgroud)
寻找nb_frames
有grep
:
ffprobe -select_streams v -show_streams input.avi 2>/dev/null | grep nb_frames | sed -e 's/nb_frames=//'
Run Code Online (Sandbox Code Playgroud)
这适用于 avi、mp4 等 对于某些容器,它不显示有效值,例如 mpeg。
在这种情况下,这有效 ffprobe -show_packets a.mpg 2>/dev/null | grep video | wc -l
use*_*307 23
这是可怕的,愚蠢的,缓慢的,但似乎工作:
ffmpeg -i foo.avi -vcodec copy -f rawvideo -y /dev/null 2>&1 | tr ^M '\n' | awk '/^frame=/ {print $2}'|tail -n 1
Run Code Online (Sandbox Code Playgroud)
它也适用于截断的文件和原始流(这就是为什么 .vob 文件一无所获)
qua*_*ote 16
我在另一个问题上发布了这个。使用该tcprobe
工具(来自transcode
包),帧数包含在信息中。使用-i
开关从文件中获取信息转储:
$ tcprobe -i foo.avi
[tcprobe] RIFF data, AVI video
[avilib] V: 29.970 fps, codec=XVID, frames=38630, width=512, height=384
[avilib] A: 48000 Hz, format=0x55, bits=16, channels=2, bitrate=128 kbps,
[avilib] 53707 chunks, 21768720 bytes, VBR
[tcprobe] summary for foo.avi, (*) = not default, 0 = not detected
import frame size: -g 512x384 [720x576] (*)
frame rate: -f 29.970 [25.000] frc=4 (*)
audio track: -a 0 [0] -e 48000,16,2 [48000,16,2] -n 0x55 [0x2000] (*)
bitrate=128 kbps
length: 38630 frames, frame_time=33 msec, duration=0:21:28.954
Run Code Online (Sandbox Code Playgroud)
请注意,此处的两行(第二个输出行和最后一个输出行)给出了帧数。
Eld*_*eek 11
我发现它mediainfo --fullscan inputfile | grep "Frame count"
适用于大多数文件。
基于 Debian 的系统可以安装它 apt-get install mediainfo
如果你得到 2 行而不是输出中的一个,第一行是视频轨道,第二行是音频轨道。这似乎发生在具有可变比特率音频的文件上。
截至编辑日期,已在 .mkv、.m4v、.mp4、flv、vob 和 .avi 样本上进行测试。
来源:Linux下如何从命令行检索视频文件信息?并在 Ubuntu 风格下进行测试。
ffprobe -select_streams v -show_frames -count_frames 输入文件 | ffprobe -select_streams v -show_frames -count_frames grep pkt_duration_time=
把持续时间加起来。sed/awk 之类的可能会更好。
从我们的测试来看,我可以说,目前它已被证明是最好、最可靠的。您可以获得精确的帧数和精确的持续时间。即使使用可变帧速率,所有其他工具(例如 mediainfo)似乎都变得很疯狂。
直接使用mediainfo
,没有 grep,没有等待,什么也没有:
mediainfo --Inform='Video;%FrameCount%' $the_file
Run Code Online (Sandbox Code Playgroud)
有关其他信息,请参阅 mediainfo --info-parameters