使用 FFmpeg 提取 MP4 视频的关键帧并计算关键帧频率可以按以下步骤进行:
提取关键帧:
使用 FFmpeg 提取视频中的关键帧可以通过以下命令实现:
ffmpeg -i input.mp4 -vf "select='eq(pict_type,I)'" -vsync vfr keyframes_%03d.jpg
这条命令的含义如下:
-i input.mp4:指定输入文件。
-vf “select=‘eq(pict_type,I)’”:使用视频滤镜选择关键帧(I 帧)。
-vsync vfr:保证输出视频帧率。
keyframes_%03d.jpg:输出的关键帧图像名称格式。
这将在当前目录下生成以 keyframes_001.jpg, keyframes_002.jpg 等命名的关键帧图像文件。
提取到的关键帧图像将会保存在 当前目录中,命名格式如 keyframes_001.jpg、keyframes_002.jpg 等。
使用以下命令查看 目录下的 JPG 文件数量:
ls guanjianzhen/*.jpg | wc -l
该命令会列出 guanjianzhen 目录中的所有 JPG 文件并计算数量,从而帮助你得出关键帧数量。
获取视频时长:
如之前提到的,使用 FFmpeg 提取视频的信息:
ffmpeg -i input.mp4
根据输出信息获取视频的总时长,并按上面提到的方式计算关键帧频率。
计算关键帧频率:
关键帧频率是指在特定时间内的关键帧数量。你可以通过以下命令来获取视频的总帧数以及时长:
在输出中找到视频的时长。如下是相关的部分:
Duration: 00:15:00.11, start: 0.000000, bitrate: 412 kb/s
这里的 Duration 指的是视频的总时长。其中 00:15:00.11 表示:
00 小时
15 分钟
00.11 秒
因此,这个视频的总时长是 15 分钟 0.11 秒,换算成秒为:
15分钟 = 15 * 60 = 900秒
加上0.11秒,视频总时长为900.11秒
ffmpeg -i input.mp4
比如,如果总时长是 90 秒,而提取到 10 帧关键帧,那么关键帧频率可以这样计算:
关键帧频率 = 关键帧数量 / 视频时长 (秒)
关键帧频率 = 10 / 90 = 0.111 (每秒 0.111 个关键帧)
通过以上步骤,你就能提取出关键帧并计算其频率。
写为一个python脚本
import subprocess
import os
import re
def get_video_duration(video_file):
result = subprocess.run(['./ffmpeg', '-i', video_file], capture_output=True, text=True)
duration_line = next((line for line in result.stderr.splitlines() if "Duration" in line), None)
if duration_line:
duration = re.search(r'Duration: (\d+):(\d+):(\d+\.\d+)', duration_line)
if duration:
hours, minutes, seconds = map(float, duration.groups())
total_seconds = hours * 3600 + minutes * 60 + seconds
return total_seconds
return None
def extract_keyframes(video_file, output_dir):
os.makedirs(output_dir, exist_ok=True)
command = [
'./ffmpeg', '-i', video_file,
'-vf', "select='eq(pict_type,I)'",
'-vsync', 'vfr',
os.path.join(output_dir, 'keyframe_%03d.jpg')
]
subprocess.run(command)
def count_keyframes(output_dir):
return len([name for name in os.listdir(output_dir) if name.endswith('.jpg')])
def main():
video_file = 'input.mp4' # 指定输入视频文件路径
output_dir = 'keyframes' # 指定关键帧输出目录
# 获取视频时长
duration_seconds = get_video_duration(video_file)
if duration_seconds is None:
print("无法获取视频时长。")
return
print(f"视频长度: {duration_seconds:.2f}秒")
# 提取关键帧
extract_keyframes(video_file, output_dir)
# 计算关键帧数量
keyframe_count = count_keyframes(output_dir)
print(f"关键帧数量: {keyframe_count}")
# 计算关键帧频率
if duration_seconds > 0:
keyframe_frequency = keyframe_count / duration_seconds
print(f"关键帧频率: {keyframe_frequency:.4f} (每秒)")
else:
print("视频时长无效,无法计算关键帧频率。")
if __name__ == "__main__":
main()