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

在Linux中从视频流截取图片帧(ffmpeg )

Linux依赖说明:

说明: 使用到的 依赖包  1. ffmpegsudo apt update 
sudo apt-get install ffmpeg2. imagemagick (选装)
(检测图像边缘信息推断清晰度,如果是简单截取但个图像帧=>用不到<=)sudo apt-get install imagemagick备注: 
指令及相关参数说明

核心指令: (作用: 执行 ffmpeg 命令提取帧,每10帧选择一帧, 一共提取5张)

示例:

ffmpeg -i “https://cdn.pixabay.com/video/2023/10/22/186115-877653483_large.mp4” -vf “select=‘not(mod(n,10))’” -frames:v 5 -q:v 1 output_%03d.jpg

指令说明:

这条 ffmpeg 命令从视频流中提取帧并保存为图片,具体的参数含义如下:

1. ffmpeg -i "https://cdn.pixabay.com/video/2023/10/22/186115-877653483_large.mp4"

  • ffmpeg:调用 ffmpeg 命令。
  • -i "https://cdn.pixabay.com/video/2023/10/22/186115-877653483_large.mp4":指定输入文件,视频源为给定的网络视频 URL。

2. -vf "select='not(mod(n,10))'"

  • -vf:表示使用视频滤镜。

  • "select='not(mod(n,10))'"
    

    :视频帧选择器,这里

    mod(n,10)
    

    表示每 10 帧提取一次帧。

    n
    

    是当前帧的编号,

    mod(n,10)
    

    计算帧编号除以 10 的余数,

    not(mod(n,10))
    

    选择那些编号是 10 的倍数的帧。

    • 换句话说,这条命令每 10 帧提取一个帧。

3. -frames:v 5

  • 只提取 5 帧图片。

4. -q:v 1

  • -q:v 设置视频帧的质量,范围为 1 到 31,值越小质量越高,1 是最高质量。

5. output_%03d.jpg

  • 输出文件名模板。%03d 是一个占位符,表示文件名中包含 3 位数字(例如 output_001.jpgoutput_002.jpg),这样可以保存多个帧。

整体含义:

从视频中每隔 10 帧提取一个帧,总共提取 5 帧,保存为高质量的 JPEG 图片文件,文件名为 output_001.jpg, output_002.jpg, 以此类推。

指令执行完可见当前文件夹中文件:

在这里插入图片描述

具体的命令可根据需求情况进行修改, 到这里文章的标题功能就已经实现了.

下面是加餐环节


需求: 提取视频中的图片帧, 并从多张中选取最清晰的一张照片

注: 其中的文件路径需要改为自己所存在的路径

这里准备了三个脚本文件如下:

  • extract_frames.sh 提取视频帧输出指定张数据照片并存到指定位置 并执行 detect_sharpness.sh 脚本(已注释掉, 需要的话自行打开)
  • detect_sharpness.sh 从多张照片中选择最清晰的一张 并将其余的照片删除, 且保留最清晰一张并重命名
  • create_directory.sh 判断文件夹是否存在, 不存在则创建, 存在则不处理

extract_frames.sh

提取视频帧输出指定张数据照片并存到指定位置 并执行 detect_sharpness.sh 脚本

注: 执行该脚本需要指定—视频路径

示例:

/data/hikuser/handler_video_to_picture/extract_frames.sh  https://cdn.pixabay.com/video/2023/10/22/186115-877653483_large.mp4
#!/bin/bash# 删除指定目录下已有的图片
rm -f /data/hikuser/handler_video_to_picture/output*.jpg# 检查是否提供了视频流 URL 参数
if [ "$#" -ne 1 ]; thenecho "Usage: ${0##*/} <video_stream_url>"exit 1
fi# 视频流 URL
VIDEO_URL="$1"# 检查输出目录是否存在
if [ ! -d "/data/hikuser/handler_video_to_picture" ]; thenecho "Directory /data/hikuser/handler_video_to_picture does not exist."exit 1
fi# 执行 ffmpeg 命令提取帧,每10帧选择一帧, 一共提取5张
if ! ffmpeg -i "$VIDEO_URL" -vf "select='not(mod(n,10))'" -frames:v 5 -q:v 1 /data/hikuser/handler_video_to_picture/output_%03d.jpg; thenecho "ffmpeg command failed."exit 1
fi# 执行检测图片清晰度的脚本
# if [ -f /data/hikuser/handler_video_to_picture/detect_sharpness.sh ]; then
#    /bin/bash /data/hikuser/handler_video_to_picture/detect_sharpness.sh
# else
#    echo "detect_sharpness.sh script not found!"
#    exit 1
# fi

detect_sharpness.sh

从多张照片中选择像素最高的一张 并将其余的照片删除, 并将最新的一张重命名

#!/bin/bash# 初始化最大边缘值和最清晰的图片变量
max_edge_value=0
sharpest_image=""# 进入图片所在目录
cd /data/hikuser/handler_video_to_picture || exit 1# 遍历每张图片并计算边缘值
for img in output_*.jpg; do# 计算图片的边缘检测值edge_value=$(convert "$img" -edge 1 -format "%[mean]" info:)echo "$img 边缘检测值: $edge_value"# 比较边缘值,保留最大值对应的图片if (( $(echo "$edge_value > $max_edge_value" | bc -l) )); thenmax_edge_value=$edge_valuesharpest_image=$imgfi
done# 输出最清晰的图片
echo "最清晰的图片是: $sharpest_image"# 删除其他图片
for img in output_*.jpg; doif [ "$img" != "$sharpest_image" ]; thenrm "$img"fi
done# 将最清晰的图片重命名为 output.jpg
mv "$sharpest_image" /data/hikuser/handler_video_to_picture/output.jpgecho "已删除其他图片,保留最清晰的图片: $sharpest_image"

脚本执行效果示例:

所以截取的图片大小因为数据源是一个静态视频, 当然如果采集帧率过快时也会出现这样的情况, 注意空值

create_directory.sh

判断文件夹是否存在存在则创建不存在则不处理

#!/bin/bash# 检查是否提供了文件夹名称参数
if [ "$#" -ne 1 ]; thenecho "Usage: ${0##*/} <directory_name>"exit 1
fi# 文件夹名称
DIR_NAME="$1"# 检查文件夹是否存在
if [ -d "$DIR_NAME" ]; thenecho "Directory '$DIR_NAME' already exists."
else# 创建文件夹mkdir -p "$DIR_NAME"if [ $? -eq 0 ]; thenecho "Directory '$DIR_NAME' has been created."elseecho "Failed to create directory '$DIR_NAME'."exit 1fi
fi

相关文章:

在Linux中从视频流截取图片帧(ffmpeg )

Linux依赖说明: 说明: 使用到的 依赖包 1. ffmpegsudo apt update sudo apt-get install ffmpeg2. imagemagick (选装) (检测图像边缘信息推断清晰度,如果是简单截取但个图像帧>用不到<)sudo apt-get install imagemagick备注: 指令及相关参数说明核心指令: (作用: 执…...

使用脚手架来创建 express 项目

使用脚手架&#xff08;scaffold&#xff09;可以快速搭建Express应用程序的基本结构。Express自身提供了一个官方脚手架工具叫做express-generator&#xff0c;它可以帮助你快速地生成一个包含基本文件结构的Express项目。 安装Express Generator 首先&#xff0c;你需要全局…...

单片机常用的软件架构

参考 9种单片机常用的软件架构...

服务器模型 Reactor 和 Proactor

Proactor 具体流程如下&#xff1a; 处理器发起异步操作&#xff0c;并关注 IO 完成事件&#xff1b;事件分离器等待操作完成事件&#xff1b;分离器等待过程中&#xff0c;内核并行执行实际的 IO 操作&#xff0c;并将结果存储入用户自定义的缓冲区&#xff0c;最后通知事件分…...

使用 Grype 检查 .jar 包中的漏洞

在开发和部署 Java 应用时&#xff0c;确保依赖库和项目文件中的安全性至关重要。Grype 是一款强大的开源工具&#xff0c;用于扫描项目文件&#xff08;如 .jar 包&#xff09;中的已知漏洞。本篇博客将介绍如何手动安装 Grype 并使用它检测 .jar 包中的安全漏洞。 一、手动安…...

IDEA 常用插件推荐,美观又实用!

1、 TONGYl Lingma - Your Al Coding Assistant. Type less, Code more. 通义灵码&#xff0c;是一款基于通义大模型的智能编码辅助工具&#xff0c;提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码注释生成、代码解释、研发智能问答、异常报错排查等能力&…...

浮点数精度问题

为什么会产生精度问题&#xff1f; 我们带着这个问题去探寻浮点数二进制的存储原理 浮点数是怎么存在计算机中的&#xff1f; 浮点数在计算机中的表示通常遵循IEEE 754标准。其基本概念如下&#xff1a; 结构&#xff1a;浮点数由三部分组成&#xff1a; 符号位&#xff08;…...

RK3576芯片在智能家居里中型智慧屏产品的应用方案分析

智能家居在近年来得到了快速发展&#xff0c;AI技术不断发展&#xff0c;人机交互十分成熟&#xff0c;各种家电也都迎来了智能化浪潮&#xff0c;智能家居为人们提供了优秀的产品体验&#xff0c;受到主流消费者的青睐&#xff0c;智能家居里的中型智慧屏产品也随之兴起。 瑞芯…...

什么是生成式 AI?

人工智能 (AI) 通过使用机器学习与环境交互并执行任务来模仿人类行为&#xff0c;而无需明确指示要输出的内容。 生成式 AI 描述 AI 中用于创建原创内容的一类功能。 人员通常与聊天应用程序中内置的生成式 AI 交互。 此类应用程序的一个常见示例是 Microsoft Copilot&#xf…...

计算机网络期末试题及答案

一、选择题(每空2分&#xff0c;共20分) 1、下列关于常用交换技术的描述不正确的是&#xff08; &#xff09;。 A、电路交换是面向连接可靠的&#xff0c;适合大量的、连续的数据传输。 B、分组交换采用存储转发方式&#xff0c;以较小的固定长度的分组作为数据传输单…...

MySQL中DML操作(一)

添加数据&#xff08;INSERT&#xff09; 1.选择插入 INSERT INTO 表名(列名1 , 列名2 , 列名3......) VALUES(值1 , 值2 , 值3......); 示例&#xff1a; 向departments表中添加一条数据&#xff0c;部门名称为market&#xff0c;工作地点ID为1。 insert into department…...

Django 模板继承

Django 模板继承的语法主要涉及两个关键标签&#xff1a;{% extends %} 和 {% block %}。 语法详解 {% extends %}&#xff1a; 用于指定当前模板继承自哪个父模板。语法&#xff1a;{% extends "父模板的路径" %} {% extends "base.html" %}{% block %}&…...

黑马点评17——多级缓存-Lua语法

文章目录 Lua语法初始Lua变量和循环条件控制、函数 变量和循环函数和条件控制 Lua语法 初始Lua https://www.lua.org/ 魔兽的一些插件就是用lua开发的。 centOs已经装好了lua&#xff0c;直接用~ 变量和循环 条件控制、函数 变量和循环 函数和条件控制...

如何在Linux 上运行 SciChart WPF图表控件?

SciChart – 一个跨平台图表库&#xff0c;可实现 Windows Presentation Foundation (WPF)、JavaScript 以及原生 iOS (Swift/Objective-C) 和 Android (Java/Kotlin)&#xff0c;基于代号为 Visual Xccelerator 的专有 C 渲染引擎。这提供了 SciChart 众所周知的速度和性能&am…...

C--字符串函数处理总结

文章目录 函数接口strchrstrtok 常见应用int 转化 字符串1 2 3 4 (int ) ---> 1&#xff0c;2&#xff0c;3&#xff0c;4 &#xff08;char []&#xff09; 字符串转化为 int1,2,3,4&#xff08;char []&#xff09; ---> 1 2 3 4 (int ) 函数接口 strchr char *strch…...

PLSQL-将一份excel数据导入到一张物理表(Oracle)

–>> 很简单~ 平时用惯了DBeaver&#xff0c;突然要用PLSQL Developer&#xff0c;确实很生疏。 –>> 我的场景&#xff0c;将一份.csv文件数据手动导入到Oracle下的一张物理表中去。 研究了半天&#xff0c;看网上说的可以用&#xff1a;Tools → ODBC Importer &…...

【系统架构设计师】状态模式

状态模式(State Pattern)是行为设计模式的一种,它允许一个对象在其内部状态改变时改变它的行为。对象看起来像是改变了它的类。这种模式可以用于实现一些复杂的有限状态机,在不同的条件下改变对象的行为而无需修改对象本身。下面是一个关于状态模式的详细介绍,包括其概念、…...

Linux网络编程1——socket通信

一.网络准备 1.套接字 在TCP/IP 协议中&#xff0c;“ip 地址TCP 或UDP 端口号”唯一标识网络通讯中的一个进程。“IP 地址端口号”就对应一个socket。欲建立连接的两个进程各自有一个 socket 来标识&#xff0c;那么这两个 socket 组成的 socket pair 就唯一标识一个连接。因…...

【每日一题】LeetCode 1052.爱生气的书店老板(数组、滑动窗口)

【每日一题】LeetCode 1052.爱生气的书店老板&#xff08;数组、滑动窗口&#xff09; 题目描述 书店老板的商店每天有不同数量的顾客进入。每分钟&#xff0c;老板可能或可能不会生气。如果老板生气&#xff0c;那一分钟的顾客就会不满意。老板知道一个秘密技巧&#xff0c;…...

IDEA中无法使用 Subversion 命令行客户端 svn Subversion 可执行文件的路径可能是错误的

IDEA中无法使用 Subversion 命令行客户端 svn 我在新电脑上安装好IDEA和SVN后使用IDEA拉取和提交项目时提示无法使用。 解决方案 我这边的问题是在安装TortoiseSVN的时候少启用了一个功能&#xff0c;需要重新安装并把这个功能启用。 在这一步需要把command line client to…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

Go 并发编程基础:通道(Channel)的使用

在 Go 中&#xff0c;Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式&#xff0c;用于在多个 Goroutine 之间传递数据&#xff0c;从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...