$ ffmpeg -i 2013-07-07\ 12.00.59.mp4 -f null /dev/null 2>&1
...
Press [q] to stop, [?] for help
[null @ 0x7fcc80836000] Encoder did not produce proper pts, making some up.
frame= 7989 fps= 92 q=0.0 Lsize=N/A time=00:04:26.30 bitrate=N/A dup=10 drop=0
video:749kB audio:49828kB subtitle:0 global headers:0kB muxing overhead -100.000042%
Received signal 2: terminating.
$
13 回答
在Unix中,这就像魅力:
Linux的
红宝石
Note: MP4 / M4V / M4A / MOV中存在编辑列表会影响您的帧编号 . 请参阅下面的编辑列表
ffprobe&ffmpeg
ffprobe:查询容器
这是一种快速的方法 .
并非所有格式都会报告帧数,从而导致
N/A
的输出 . 请参阅下面列出的其他方法 .ffprobe:解码并计算帧数
ffmpeg:解码并计算帧数
如果您没有
ffprobe
,则可以使用ffmpeg
和awk
代替:这是一种缓慢的方法 . 由于必须对整个文件进行解码,因此根据输入的持续时间和复杂程度,可能需要一段时间才能完成 .
如果您没有
awk
(例如在Windows上),可以省略2>&1 | awk '/frame=/{print $2}'
,并在控制台输出结尾附近引用frame=
.仅计算关键帧
添加
-skip_frame nokey
.ffprobe
和ffmpeg
.编辑清单
使用
-ignore_editlist 1
输入选项忽略MP4 / M4V / M4A / MOV编辑列表 . 默认为 not 忽略编辑列表 .ffprobe选项的含义
-v error
这会隐藏"info"输出(版本信息等),这使得解析更容易 .-count_frames
计算每个流的帧数并在相应的流部分中报告 .-select_streams v:0
仅选择视频流 .-show_entries stream=nb_frames
或-show_entries stream=nb_read_frames
仅显示nb_frames
或nb_read_frames
的条目 .-of default=nokey=1:noprint_wrappers=1
将输出格式(又名"writer")设置为default
,不要打印每个字段的键(nokey=1
),也不要打印节页眉和页脚(noprint_wrappers=1
) . 有更短的替代品,如-of csv=p=0
.另见
FFprobe Documentation
FFmpeg Wiki: FFprobe Tips
mediainfo
众所周知的
mediainfo
工具可以输出帧数:MP4Box
适用于MP4 / M4V / M4A文件 .
来自gpac的
MP4Box
可以显示帧数:请参阅输出中的
Media Info
行以查看相关视频流:在该示例中,视频流具有2525帧 .
boxdumper
适用于MP4 / M4V / M4A / MOV文件 .
boxdumper
是l-smash的简单工具 . 它将输出大量信息 . 在stsz
样本大小框部分下,请参阅sample_count
了解帧数 . 在此示例中,输入具有1900个视频帧:stsz
原子 .而是根据时间计算它 .
这就是我的工作,它对我和其他许多人都很有用 . )首先,在下面的片段中找到视频的长度:
您应该能够始终如一地安全地找到
Duration: hh:mm:ss.nn
以确定源视频片段大小 . 然后,对于每个更新行(CR,无LF),您可以解析它所在的当前时间标记的文本:只是因为并不总是期望这些状态线的完美输出 . 它们可以包含如下错误消息:
一旦你有时间,这是简单的数学:
time / durration * 100 = % done
.并非所有格式都存储其帧数或总持续时间 - 即使它们存在,也可能不完整 - 因此ffmpeg默认情况下不会准确检测到它们 .
相反,尝试寻找文件的末尾并读取时间,然后计算当前时间 .
或者,您可以尝试
AVFormatContext->nb_index_entries
或检测到的持续时间,这应该可以在至少未损坏的AVI / MOV或库FFMS2上工作,这可能太慢而无法为进度条打扰 .尝试类似的东西:
它将帧编号写入stderr,因此您可以从中检索最后一帧 .
您可以使用
ffprobe
通过以下命令获取帧编号ffprobe.exe -i video_name -print_format json -loglevel fatal -show_streams -count_frames -select_streams v
告诉以
json
格式打印数据select_streams v
会告诉ffprobe
只是给我们video
流数据,如果你删除它,它会给你audio
信息好输出就像
你可以用
这将为您提供流数据,如果您想要选择帧速率等信息,请使用以下命令
根据您的视频信息给出一个数字,问题是当您使用此方法时,可能会得到
N/A
作为输出 .有关更多信息,请查看此页FFProbe Tips
试试这个:
以斯图的答案为基础 . 这是我如何从手机中找到视频的帧速率 . 我运行了以下命令一段时间 . 在让我不耐烦并且点击^ C之前,我让帧数达到约10,000!
然后,我 grab 了该行的两条信息,以“frame =”开头,帧数为7989,时间为00:04:26.30 . 首先需要将时间转换为秒,然后将帧数除以秒,以获得“每秒帧数” . “每秒帧数”是您的帧速率 .
我的视频的帧速率是30 fps .
我能做到的唯一准确的是:
要确保这适用于视频:
我使用php_ffmpeg然后我可以得到电影的所有时间和所有帧 . 如下
然后详细信息在页面上 .
http://ffmpeg-php.sourceforge.net/doc/api/ffmpeg_movie.php
对不起,这可能需要这个(因为我没有找到最近的ffmpeg版本的解决方案) .
使用ffmpeg 3.3.4我发现可以找到以下内容:
最后它将输出帧数 . 它适用于带有音频的视频 . 它提供了两次“nb_frames”行,但第一行是我测试的视频的实际帧数 .
在其中一个答案中提到了如何使用'mediainfo'计算帧数:
mediainfo --Output =“Video;%FrameCount%”input.avi
如果输入文件是h264基本流'mediainfo'则不报告帧数 . 仅当输入文件是容器(mp4,ts或avi)时,才会计算和报告帧数 .