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

基于Linux的ffmpeg python的关键帧抽取

1.FFmpeg的环境配置

首先强调,ffmpeg-python包与ffmpeg包不一样。

1) 创建一个虚拟环境env

conda create -n yourenv python=3.x
conda activate yourenv

2) ffmpeg-python包的安装

pip install ffmpeg-python

3) 安装系统级别的 FFmpeg 工具

虽然安装了 ffmpeg-python 包(也就是 Python 的 wrapper),但是系统里没有安装实际的 FFmpeg 可执行程序,会导致程序无法执行 ffmpeg 工具。

🧪在系统中安装 FFmpeg 二进制文件

cd ./your_env_path
conda install -c conda-forge ffmpeg

🔁安装完成后,验证 FFmpeg 是否可用

ffmpeg -version

4) FFmpeg 添加到系统变量

首先,在终端确认 FFmpeg 安装位置

which ffmpeg

你应该会看到类似的输出结果:

/usr/bin/ffmpeg
# 如果是在 Conda 环境下安装的,则输出:
/your_env_path/envs/yourenv/bin/ffmpeg  
# 例如:/home/zrw/anaconda3/envs/condetect/bin/ffmpeg

第二步,临时验证 PATH 设置
在 Python 脚本中 运行前添加如下代码,确保 FFmpeg 所在路径加入环境变量:

import os# 添加 FFmpeg 路径(改成你实际的 ffmpeg 路径)
os.environ["PATH"] += os.pathsep + "/your_env_path/envs/yourenv/bin/ffmpeg"
# 例如:os.environ["PATH"] += os.pathsep + "/home/zrw/anaconda3/envs/condetect/bin/ffmpeg"

放在程序中调用 ffmpeg之前就可以了。

第三步(可选):永久添加到 PATH

export PATH=$PATH:/yourenv_path/envs/yourenv/bin

然后运行:

source ~/.bashrc

5) 验证安装是否成功

建立一个python文件,输入以下代码,正确输出即可。

import ffmpeg
print(ffmpeg.__file__)  # 应该输出路径,比如 .../site-packages/ffmpeg/__init__.py
print(dir(ffmpeg))      # 应该能看到 ['input', 'output', 'run', ...]

打印结果如下:

在这里插入图片描述

2.主程序

🚀引入环境

import os
import ffmpeg
import numpy as np
from PIL import Image# 添加 FFmpeg 路径(改成你实际的 ffmpeg 路径)
os.environ["PATH"] += os.pathsep + "/home/zrw/anaconda3/envs/condetect/bin"

按固定帧数间隔抽帧

def extract_keyframes(video_path, output_dir, frame_interval=120):
os.makedirs(output_dir, exist_ok=True)(ffmpeg.input(video_path).filter("select", f"not(mod(n,{frame_interval}))")  # 每N帧取1帧.output(os.path.join(output_dir, "frame_%04d.png")).run(quiet=True)
)return sorted([f for f in os.listdir(output_dir) if f.endswith(".png")])

按固定时间间隔(秒)抽帧

def extract_keyframes(video_path, output_dir, interval_seconds=8):os.makedirs(output_dir, exist_ok=True)(ffmpeg.input(video_path).filter("fps", fps=1/interval_seconds)  # 如 interval_seconds=8 表示每8秒1帧.output(os.path.join(output_dir, "frame_%04d.png")).run(quiet=True))return sorted([f for f in os.listdir(output_dir) if f.endswith(".png")])

相关文章:

  • SFOS2:常用容器(布局)介绍
  • Flink CDC 出现错误码 1236 和 SQL 状态 HY000 的原因及解决方法
  • 如何诊断服务器引导分区损坏问题
  • 人类的真实感知
  • 2025年水利水电工程施工企业(安全员A证)考试题
  • 关于ResNet和FPN的一份介绍
  • 什么是原型污染?如何防止原型污染?
  • ADB的安装及抓取日志(1)
  • OpenShift介绍,跟 Kubernetes ,Docker关系
  • 接口自动化测试(一)
  • 乐维网管平台核心功能解析(十)——流量分析
  • 解决Dify使用Docker Compose部署中无法通过OpenAI插件等国外大模型厂商的插件访问其API的问题
  • LinkedList<Integer> 常用方法通俗讲解
  • sqlite3 sqlcipher加密,解密,集成springboot,读取sqlcipher加密工具
  • 鸿蒙应用元服务开发-Account Kit未成年人模式订阅和处理用户信息变更
  • Docusaurus 博客文章的元数据配置详解
  • 玩转Docker | 使用Docker部署Memos笔记工具
  • Vue3.5 企业级管理系统实战(十五):其他全局设置项
  • 【系统搭建】DPDK安装配置与helloworld运行
  • 储能EMS功能优先级评分表
  • 青岛做门户网站的有哪些/推广工具
  • 深圳做响应式网站制作/深圳百度首页优化
  • 网站开发项目方案/seo投放是什么意思
  • 微网站建设高端网站定制/网站推广途径和推广要点有哪些?
  • 建设银行手机银行app类型/做搜索引擎优化的企业
  • 免费申请httq//网站?/关键词排名优化品牌