如何在 linux 命令行上获取视频中的帧数?

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_framesgrep

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

  • 此文件中的 nb_frames=N/A:http://web.archive.org/web/20180117220713/http://techslides.com/demos/sample-videos/small.webm (2认同)

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 风格下进行测试。

您可以在此处找到适用于您的操作系统的媒体信息


Gui*_*ain 5

ffprobe -select_streams v -show_frames -count_frames 输入文件 | ffprobe -select_streams v -show_frames -count_frames grep pkt_duration_time=

把持续时间加起来。sed/awk 之类的可能会更好。

从我们的测试来看,我可以说,目前它已被证明是最好、最可靠的。您可以获得精确的帧数和精确的持续时间。即使使用可变帧速率,所有其他工具(例如 mediainfo)似乎都变得很疯狂。


xen*_*oid 5

直接使用mediainfo,没有 grep,没有等待,什么也没有:

mediainfo --Inform='Video;%FrameCount%' $the_file
Run Code Online (Sandbox Code Playgroud)

有关其他信息,请参阅 mediainfo --info-parameters