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

【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 redef 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 + secondsreturn total_secondsreturn Nonedef 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("无法获取视频时长。")returnprint(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_secondsprint(f"关键帧频率: {keyframe_frequency:.4f} (每秒)")else:print("视频时长无效,无法计算关键帧频率。")if __name__ == "__main__":main()

相关文章:

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

使用 FFmpeg 提取 MP4 视频的关键帧并计算关键帧频率可以按以下步骤进行: 提取关键帧: 使用 FFmpeg 提取视频中的关键帧可以通过以下命令实现: ffmpeg -i input.mp4 -vf "selecteq(pict_type,I)" -vsync vfr keyframes_%03d.jpg…...

数字孪生可视化在各个行业的应用场景

数字孪生技术,作为新一代信息技术的集大成者,正在深刻改变着我们对物理世界的认知和管理方式。本文将探讨数字孪生可视化在不同行业的应用场景,以及它们如何赋能行业数字化转型。 1. 智慧城市与交通 在智慧城市领域,数字孪生技术…...

Python实现windows自动关机

python <shut.py> import ntplib from datetime import datetime, timezoneimport time import osimport easygui# net time def get_network_time():time.sleep(3)"""从网络时间服务器获取时间"""client ntplib.NTPClient()response c…...

Go可以使用设计模式,但绝不是《设计模式》中的那样

文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons&#xff1a;JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram&#xff0c;自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 &#xff1f; 5 IDEA必装的插件&…...

【C语言】_使用冒泡排序模拟实现qsort函数

目录 1. 排序函数的参数 2. 排序函数函数体 2.1 比较元素的表示 2.2 交换函数Swap的实现 2.3 排序函数bubble_sort的实现 3. 测试整型数据排序 3.1 整型数据比较函数cmp_int的实现 3.2 整型数据排序后输出函数print_int的实现 3.3 整型数据测试函数test_int的实现 3…...

openCvSharp 计算机视觉图片找茬

一、安装包 <PackageReference Include"OpenCvSharp4" Version"4.10.0.20241108" /> <PackageReference Include"OpenCvSharp4.runtime.win" Version"4.10.0.20241108" /> 二、准备两张图片 三、编写代码 using OpenCv…...

从零开始开发纯血鸿蒙应用之处理外部文件

从零开始开发纯血鸿蒙应用 一、外部文件二、外部文件的访问形式1、主动访问2、被动访问 三、代码实现1、DocumentViewPicker2、Ability Skills3、onNewWant 函数4、冷启动时处理外部文件 一、外部文件 对于移动端app来说&#xff0c;什么是外部文件呢&#xff1f;是那些存储在…...

Spring中三级缓存详细讲解

1、Spring三级缓存是什么&#xff0c;过程是怎么样的&#xff1f; Spring 中的三级缓存主要用于单例 Bean 的生命周期管理&#xff0c;特别是在循环依赖时&#xff0c;它通过不同阶段暴露 Bean 实例来确保依赖注入的顺利完成。缓存的内容如下&#xff1a; 一级缓存 (singleton…...

论文阅读:《Whole-animal connectomes of both Caenorhabditis elegans sexes》

一 论文整体概述 论文下载链接&#xff1a;《Whole-animal connectomes of both Caenorhabditis elegans sexes》 补充信息和额外数据&#xff1a;https://www.nature.com/articles/s41586-019-1352-7 1. 作者期刊背景 该论文由Scott W. Emmons&#xff0c;David H. Hall等…...

嵌入式开发之STM32学习笔记day03

STM32之ADC&#xff08;模拟数字转换器&#xff09; 1 ADC简述2 ADC转换时间3 ADC转化结果存放机制4 ADC转化结果存放机制5 ADC电压转换 1 ADC简述 ADC&#xff08;Analog-Digital Converter&#xff09;模拟—数字转换器&#xff1b;ADC可以将引脚上连续变化的模拟电压转换为…...

windows10 安装 Golang 版本控制工具g与使用

下载包&#xff1a;https://github.com/voidint/g/releases 解压&#xff0c; 并添加到环境变量 g 常用命令 查询当前可供安装的stable状态及所有的 go 版本 # stable 版本 g ls-remote stable# 所有版本 g ls-remote安装目标 go 版本1.23.4g install 1.23.4切换到已安装的…...

SpringBoot 使用 Cache 集成 Redis做缓存保姆教程

1. 项目背景 Spring Cache是Spring框架提供的一个缓存抽象层&#xff0c;它简化了缓存的使用和管理。Spring Cache默认使用服务器内存&#xff0c;并无法控制缓存时长&#xff0c;查找缓存中的数据比较麻烦。 因此Spring Cache支持将缓存数据集成到各种缓存中间件中。本文已常…...

R数据分析:多分类问题预测模型的ROC做法及解释

有同学做了个多分类的预测模型,结局有三个类别,做的模型包括多分类逻辑回归、随机森林和决策树,多分类逻辑回归是用ROC曲线并报告AUC作为模型评估的,后面两种模型报告了混淆矩阵,审稿人就提出要统一模型评估指标。那么肯定是统一成ROC了,刚好借这个机会给大家讲讲ROC在多…...

数据结构与算法之二叉树: LeetCode 654. 最大二叉树 (Ts版)

最大二叉树 https://leetcode.cn/problems/maximum-binary-tree/ 描述 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值递归地在最大值 左边 的 子数组前缀上 构建左子树递归地在最大值…...

Linux 容器漏洞

定义&#xff1a;Linux 容器漏洞是指在容器技术&#xff08;如 Docker、LXC 等&#xff09;运行环境中存在的安全弱点。这些漏洞可能存在于容器镜像本身、容器运行时&#xff08;如 runc&#xff09;、容器编排工具&#xff08;如 Kubernetes&#xff09;或者容器与主机之间的交…...

file与io流(1)

-1- java.io.File类的使用 &#xff08;1&#xff09; 概述 File类及本章下的各种流&#xff0c;都定义在java.io包下。一个File对象代表硬盘或网络中可能存在的一个文件或者文件目录&#xff08;俗称文件夹&#xff09;&#xff0c;与平台无关。&#xff08;体会万事万物皆…...

忘记了PDF文件的密码,怎么办?

PDF文件可以加密&#xff0c;大家都不陌生&#xff0c;并且大家应该也都知道PDF文件有两种密码&#xff0c;一个打开密码、一个限制编辑密码&#xff0c;因为PDF文件设置了密码&#xff0c;那么打开、编辑PDF文件就会受到限制。忘记了PDF密码该如何解密&#xff1f; PDF和offi…...

Linux权限管理(用户和权限之间的关系)

Linux系列 文章目录 Linux系列一、Linux下用户类型二、普通权限的基本概念2.1、Linux中权限的类别2.2、Linux中权限对应的三种身份2.3、文件权限的标识 三、文件权限设置四、修改文件属主和属组4.1、chown修改文件的属主4.2、修改所属组 五、文件掩码六、目录权限 一、Linux下用…...

Python Selenium库入门使用,图文详细。附网页爬虫、web自动化操作等实战操作。

文章目录 前言1 创建conda环境安装Selenium库2 浏览器驱动下载&#xff08;以Chrome和Edge为例&#xff09;3 基础使用&#xff08;以Chrome为例演示&#xff09;3.1 与浏览器相关的操作3.1.1 打开/关闭浏览器3.1.2 访问指定域名的网页3.1.3 控制浏览器的窗口大小3.1.4 前进/后…...

【Uniapp-Vue3】使用defineExpose暴露子组件的属性及方法

如果我们想要让父组件访问到子组件中的变量和方法&#xff0c;就需要使用defineExpose暴露&#xff1a; defineExpose({ 变量 }) 子组件配置 父组件配置 父组件要通过onMounted获取到子组件的DOM 传递多个属性和方法 子组件 父组件...

【多模态LLM】英伟达NVLM多模态大模型训练细节和数据集

前期笔者介绍了OCR-free的多模态大模型&#xff0c;可以参考&#xff1a;【多模态&文档智能】OCR-free感知多模态大模型技术链路及训练数据细节&#xff0c;其更偏向于训练模型对于密集文本的感知能力。本文看一看英伟达出品的多模态大模型NVLM-1.0系列&#xff0c;虽然暂未…...

HTTP详解——HTTP基础

HTTP 基本概念 HTTP 是超文本传输协议 (HyperText Transfer Protocol) 超文本传输协议(HyperText Transfer Protocol) HTTP 是一个在计算机世界里专门在 两点 之间 传输 文字、图片、音视频等 超文本 数据的 约定和规范 1. 协议 约定和规范 2. 传输 两点之间传输&#xf…...

MySQL教程之:输入查询

如上一节所述&#xff0c;确保您已连接到服务器。这样做本身不会选择任何要使用的数据库&#xff0c;但没关系。在这一点上&#xff0c;了解一下如何发出查询比直接创建表、加载数据和从中检索数据更重要。本节介绍输入查询的基本原则&#xff0c;使用几个查询&#xff0c;您可…...

docker+ffmpeg+nginx+rtmp 拉取摄像机视频

1、构造程序容器镜像 app.py import subprocess import json import time import multiprocessing import socketdef check_rtmp_server(host, port, timeout5):try:with socket.create_connection((host, port), timeout):print(f"RTMP server at {host}:{port} is avai…...

不同音频振幅dBFS计算方法

1. 振幅的基本概念 振幅是描述音频信号强度的一个重要参数。它通常表示为信号的幅度值&#xff0c;幅度越大&#xff0c;声音听起来就越响。为了更好地理解和处理音频信号&#xff0c;通常会将振幅转换为分贝&#xff08;dB&#xff09;单位。分贝是一个对数单位&#xff0c;能…...

【17. 电话号码的字母组合 中等】

题目&#xff1a; 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例 1&#xff1a; 输入&#xff1a;digits “23”…...

数据结构初阶---排序

一、排序相关概念与运用 1.排序相关概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的…...

【从0-1实现一个前端脚手架】

目录 介绍为什么需要脚手架&#xff1f;一个脚手架应该具备哪些功能&#xff1f; 脚手架实现初始化项目相关依赖实现脚手架 发布 介绍 为什么需要脚手架&#xff1f; 脚手架本质就是一个工具&#xff0c;作用是能够让使用者专注于写代码&#xff0c;它可以让我们只用一个命令…...

AI文章管理系统(自动生成图文分发到分站)

最近帮一个网上的朋友做了一套AI文章生成系统。他的需求是这样&#xff1a; 1、做一个服务端转接百度文心一言的生成文章的API接口。 2、服务端能注册用户&#xff0c;用户在服务端注册充值后可以获取一个令牌&#xff0c;这个令牌填写到客户端&#xff0c;客户端就可以根据客…...

【Leetcode 每日一题】3270. 求出数字答案

问题背景 给你三个 正 整数 n u m 1 num_1 num1​&#xff0c; n u m 2 num_2 num2​ 和 n u m 3 num_3 num3​。 数字 n u m 1 num_1 num1​&#xff0c; n u m 2 num_2 num2​ 和 n u m 3 num_3 num3​ 的数字答案 k e y key key 是一个四位数&#xff0c;定义如下&…...

长沙的企业网站建设/关键词怎么选择技巧

逻辑简单&#xff0c;直接上代码。 #define _CRT_SECURE_NO_WARNINGS 1 //1.能够被4整除&#xff0c;但是不能被100整除的年份是闰年; //2.能够被400整除的年份是闰年#include<stdio.h> void leap_year_judge(int year)//判断闰年函数 {if ((year % 4 0 && yea…...

专业做食材网站/有哪些网站可以免费推广

&#x1f4a5; 项目专栏&#xff1a;【Python实现经典机器学习算法】附代码原理介绍 文章目录前言一、Agagrad优化原理二、更新规则三、迭代过程四、代码实践前言 &#x1f451; 最近粉丝群中很多朋友私信咨询一些决策树、逻辑回归等机器学习相关的编程问题&#xff0c;为了能更…...

凡科怎么建设网站/舟山seo

问题背景&#xff1a; 在Visual Studio 2017中打开一个往期工程&#xff0c;已知工程是在framework 4.6.1下生成的&#xff0c;同时在工程中调用Matlab生成的.dll文件&#xff0c;但是使用的Matlab的版本未知。 1、首先直接打开工程的时候&#xff0c;显示framework版本不对&am…...

龙岩新闻网/长沙官网seo推广

二分查找&#xff1a; 引用网上大神的一句话&#xff1a; Although the basic idea of binary search is comparatively straightforward, the details can be surprisingly tricky... 这句话可以这样理解&#xff1a;思路很简单&#xff0c;细节是魔鬼。 所以本文中讲述的都是…...

昆明高端网站建设/杭州优化排名哪家好

2019独角兽企业重金招聘Python工程师标准>>> HDFS小文件处理解决方案总结facebook(HayStack) 淘宝&#xff08;TFS&#xff09; 博客分类&#xff1a; 数据库 hbase 一、概述 手机图片或者像淘宝这样的网站中的产品图片特点&#xff1a; &#xff08;1&#xff09;…...

电子手表网站/关于营销的最新的新闻

网络框架的选择 C++语言里面有asio和libuv等网络库, 可以方便的进行各种高效编程. 但是C#里面, 情况不太一样, C#自带的网络API有多种. 例如: Socket TcpStream(同步接口和BeginXXX异步接口) TcpStream Async/Await Pipeline IO ASP.NET Core Bedrock 众多网络库, 但是每个编程…...