当前位置: 首页 > article >正文

【python小工具】怎么获取视频的关键帧频率?

使用 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()

http://www.kler.cn/a/499866.html

相关文章:

  • 计算机网络(四)网络层
  • .NETCore WebApi阻止接口重复调用(并发操作)
  • JVM实战—13.OOM的生产案例
  • Apache Hop从入门到精通 第一课 揭开Apache Hop神秘面纱
  • C# 语法中级
  • 后端技术选型 sa-token校验学习 下 结合项目学习 后端鉴权
  • 计算机网络 (36)TCP可靠传输的实现
  • python项目结构,PyCharm 调试Debug模式配置
  • winform第三方界面开源库AntdUI的使用教程保姆级环境设置篇
  • 信息系统项目管理-采购管理-采购清单示例
  • 2024.10.12 校招 实习 内推 面经
  • 【问题记录】解决小米手机无线投屏出现白屏什么都无法显示的问题
  • 【ROS2】☆ launch之Python
  • 重生之我在21世纪学C++—string
  • 【cuda学习日记】2.2 使用2维网络(grid)和2维块(block)对矩阵进行求和
  • 基于springboot+vue的高校创新创业课程体系的设计与实现
  • OpenAI掌舵人解读OpenAI新进展:迈向超级智能。
  • 传奇3仿韩服单机版安装教程+GM管理面板
  • 20250111面试鸭特训营第19天
  • postgresql|数据库|利用sqlparse和psycopg2库批量按顺序执行SQL语句(psyconpg2新优化版本)
  • 请求方式(基于注解实现)