以斯图的答案为基础。这是我如何从手机中找到视频的帧速率。我运行了以下命令一段时间。在让我不耐烦并且点击^ C之前,我让帧数达到约10,000!
$ 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. $
然后,我抓住了该行的两条信息,以“frame =”开头,帧数为7989,时间为00:04:26.30。首先需要将时间转换为秒,然后将帧数除以秒,以获得“每秒帧数”。 “每秒帧数”是您的帧速率。
$ bc -l 0*60*60 + 4*60 + 26.3 266.3 7989/(4*60+26.3) 30.00000000000000000000 $
我的视频的帧速率是30 fps。
对不起,这可能需要这个(因为我没有找到最近的ffmpeg版本的解决方案)。
使用ffmpeg 3.3.4我发现可以找到以下内容:
ffprobe -i video.mp4 -show_streams -hide_banner | grep "nb_frames"
最后它将输出帧数。它适用于带有音频的视频。它提供了两次“nb_frames”行,但第一行是我测试的视频的实际帧数。
试试这个:
ffmpeg -i "path to file" -f null /dev/null 2>&1 | grep 'frame=' | cut -f 2 -d ' '
我使用php_ffmpeg然后我可以得到电影的所有时间和所有帧。如下
$input_file='/home/strone/workspace/play/CI/abc.rmvb'; $ffmpegObj = new ffmpeg_movie($input_file); echo $ffmpegObj->getDuration(); echo $ffmpegObj->getFrameCount();
然后详细信息在页面上。
http://ffmpeg-php.sourceforge.net/doc/api/ffmpeg_movie.php
在其中一个答案中提到了如何使用'mediainfo'计算帧数:
mediainfo --Output =“Video;%FrameCount%”input.avi
如果输入文件是h264基本流'mediainfo'则不报告帧数。 仅当输入文件是容器(mp4,ts或avi)时,才会计算和报告帧数。
Linux的
ffmpeg -i "/home/iorigins/袟邪胁邪薪褌邪卸械薪薪褟/123.mov" -f null /dev/null
红宝石
result = `ffmpeg -i #{path} -f null - 2>&1` r = result.match("frame=([0-9]+)") p r[1]
您可以使用 ffprobe 使用以下命令获取帧编号
ffprobe
ffprobe.exe -i video_name -print_format json -loglevel fatal -show_streams -count_frames -select_streams v
告诉打印数据 json 格式
json
select_streams v 会告诉 ffprobe 给我们 video 流数据,如果你删除它,它会给你 audio 信息也是如此
select_streams v
video
audio
输出就像
{ "streams": [ { "index": 0, "codec_name": "mpeg4", "codec_long_name": "MPEG-4 part 2", "profile": "Simple Profile", "codec_type": "video", "codec_time_base": "1/25", "codec_tag_string": "mp4v", "codec_tag": "0x7634706d", "width": 640, "height": 480, "coded_width": 640, "coded_height": 480, "has_b_frames": 1, "sample_aspect_ratio": "1:1", "display_aspect_ratio": "4:3", "pix_fmt": "yuv420p", "level": 1, "chroma_location": "left", "refs": 1, "quarter_sample": "0", "divx_packed": "0", "r_frame_rate": "10/1", "avg_frame_rate": "10/1", "time_base": "1/3000", "start_pts": 0, "start_time": "0:00:00.000000", "duration_ts": 256500, "duration": "0:01:25.500000", "bit_rate": "261.816000 Kbit/s", "nb_frames": "855", "nb_read_frames": "855", "disposition": { "default": 1, "dub": 0, "original": 0, "comment": 0, "lyrics": 0, "karaoke": 0, "forced": 0, "hearing_impaired": 0, "visual_impaired": 0, "clean_effects": 0, "attached_pic": 0 }, "tags": { "creation_time": "2005-10-17 22:54:33", "language": "eng", "handler_name": "Apple Video Media Handler", "encoder": "3ivx D4 4.5.1" } } ] }
2。 您可以使用
ffprobe -v error -show_format -show_streams video_name
这将为您提供流数据,如果您想要选择帧速率等信息,请使用以下命令
ffprobe -v error -select_streams v:0 -show_entries stream=avg_frame_rate -of default=noprint_wrappers=1:nokey=1 video_name
根据您的视频信息给出一个数字,问题是当您使用此方法时,可能会得到一个 N/A 作为输出。
N/A
有关更多信息,请查看此页面 FFProbe提示
我能做到的唯一准确的是:
ffprobe -i my_video.mp4 -show_frames 2>&1|grep -c '^\[FRAME'
要确保这适用于视频:
ffprobe -i my_video.mp4 -show_frames 2>&1 | grep -c media_type=video
并非所有格式都存储其帧数或总持续时间 - 即使它们存在,也可能不完整 - 因此ffmpeg默认情况下不会准确检测到它们。
相反,尝试寻找文件的末尾并读取时间,然后计算当前时间。
或者,你可以试试 AVFormatContext->nb_index_entries 或检测到的持续时间,它应该在至少未损坏的AVI / MOV或库FFMS2上工作,这可能太慢而无法为进度条打扰。
AVFormatContext->nb_index_entries
在Unix中,这就像魅力:
ffmpeg -i 00000.avi -vcodec copy -acodec copy -f null /dev/null 2>&1 | grep 'frame=' | cut -f 2 -d ' '