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

数据脱敏工具:基于 FFmpeg 的视频批量裁剪

在数据处理和隐私保护领域,数据脱敏是一项重要的任务,尤其是在处理包含敏感信息的视频数据时。本文介绍了一种使用 Python 和 FFmpeg 实现的视频批量裁剪工具,该工具可以将视频中的敏感区域裁剪掉,从而实现数据脱敏。通过使用 PyInstaller 将 Python 脚本打包成独立的可执行文件,确保该工具可以在没有安装 FFmpeg 的计算机上正常运行。本文详细介绍了工具的实现过程、打包方法以及测试步骤,旨在为数据安全和隐私保护提供一种高效、可靠的解决方案。

1.安装必要的库,首先,确保你已经安装了以下库:

tkinter:用于文件对话框的选择。
subprocess:用于调用外部命令(如 FFmpeg)。
os 和 sys:用于文件路径操作和获取可执行文件的目录。

1.2 下载 FFmpeg

下载 FFmpeg 的 Windows 版本可执行文件,并将其放置在你的项目目录中。你可以从 FFmpeg官方网站 下载适合的版本。

2.编写 Python 脚本

2.1 获取 FFmpeg 路径

为了确保在打包后的 exe 文件中能够正确找到 FFmpeg,我们需要动态获取 FFmpeg 的路径。使用 sys._MEIPASS 可以在打包后的环境中获取可执行文件的目录。

import os
import subprocess
import sys
import tkinter as tk
from tkinter import filedialogdef get_ffmpeg_path():# 获取可执行文件的目录if hasattr(sys, '_MEIPASS'):exe_dir = sys._MEIPASSelse:exe_dir = os.path.dirname(os.path.abspath(__file__))# FFmpeg 可执行文件的相对路径ffmpeg_path = os.path.join(exe_dir, 'ffmpeg-win64-v4.2.2.exe')return ffmpeg_path

2.2 视频裁剪函数

定义一个函数 crop_video,用于调用 FFmpeg 进行视频裁剪。

def crop_video(input_file, output_file, x1, y1, x2, y2):# 获取 FFmpeg 可执行文件的路径ffmpeg_path = get_ffmpeg_path()# 构建 FFmpeg 命令command = [ffmpeg_path,'-i', input_file,  # 输入文件'-vf', f'crop={x2 - x1}:{y2 - y1}:{x1}:{y1}',  # 裁剪参数'-c:v', 'libx264',  # 使用 H.264 编码器'-crf', '18',  # 设置 CRF 值'-preset', 'slow',  # 设置编码速度/质量权衡'-b:v', '5000k',  # 设置视频比特率'-c:a', 'copy',  # 复制音频流output_file  # 输出文件]# 执行命令try:subprocess.run(command, check=True)except subprocess.CalledProcessError as e:print(f"Error executing FFmpeg: {e}")except FileNotFoundError as e:print(f"FFmpeg not found: {e}")

2.3 批量裁剪函数

定义一个函数 batch_crop_videos,用于遍历输入文件夹中的所有视频文件,并调用 crop_video 进行裁剪。

def batch_crop_videos(input_folder, output_folder, x1, y1, x2, y2):# 确保输出文件夹存在if not os.path.exists(output_folder):os.makedirs(output_folder)# 遍历输入文件夹中的所有文件for filename in os.listdir(input_folder):if filename.endswith(('.wmv', '.mp4', '.avi', '.mkv')):  # 支持的视频格式input_file = os.path.join(input_folder, filename)# 生成输出文件路径,统一为 .mp4 格式output_filename = os.path.splitext(filename)[0] + '.mp4'output_file = os.path.join(output_folder, output_filename)print(f"Cropping {input_file} to {output_file}")crop_video(input_file, output_file, x1, y1, x2, y2)

2.4 主函数

定义主函数 main,用于创建 Tkinter 窗口,让用户选择输入和输出文件夹,并设置裁剪区域坐标。

def main():# 创建 Tkinter 窗口root = tk.Tk()root.withdraw()  # 隐藏主窗口# 选择输入文件夹input_folder = filedialog.askdirectory(title="Select Input Folder")if not input_folder:print("No input folder selected. Exiting.")return# 选择输出文件夹output_folder = filedialog.askdirectory(title="Select Output Folder")if not output_folder:print("No output folder selected. Exiting.")return# 设置裁剪区域坐标x1 = 250  # 左上角 X 坐标y1 = 137  # 左上角 Y 坐标x2 = 1030  # 右下角 X 坐标y2 = 820  # 右下角 Y 坐标batch_crop_videos(input_folder, output_folder, x1, y1, x2, y2)if __name__ == "__main__":main()

3. 打包成可执行文件

3.1使用 PyInstaller 打包

使用 PyInstaller 将 Python 脚本打包成独立的可执行文件。确保将 FFmpeg 可执行文件包含在内。

pyinstaller --onefile --add-binary "ffmpeg-win64-v4.2.2.exe;." crop_videos.py

3.2 解释打包命令

–onefile:将所有依赖项打包成一个单独的可执行文件。
–add-binary “ffmpeg-win64-v4.2.2.exe;.”:将 FFmpeg 可执行文件包含在内,并将其放置在可执行文件的同一目录中。
crop_videos.py:你的 Python 脚本文件名。

4. 测试可执行文件

将生成的 exe 文件发送到没有安装 FFmpeg 的计算机上进行测试,确保其能够正常运行。完整脚本如下:

import os
import subprocess
import sys
import tkinter as tk
from tkinter import filedialogdef get_ffmpeg_path():# 获取可执行文件的目录if hasattr(sys, '_MEIPASS'):exe_dir = sys._MEIPASSelse:exe_dir = os.path.dirname(os.path.abspath(__file__))# FFmpeg 可执行文件的相对路径ffmpeg_path = os.path.join(exe_dir, 'ffmpeg-win64-v4.2.2.exe')return ffmpeg_pathdef crop_video(input_file, output_file, x1, y1, x2, y2):# 获取 FFmpeg 可执行文件的路径ffmpeg_path = get_ffmpeg_path()# 构建 FFmpeg 命令command = [ffmpeg_path,'-i', input_file,  # 输入文件'-vf', f'crop={x2 - x1}:{y2 - y1}:{x1}:{y1}',  # 裁剪参数'-c:v', 'libx264',  # 使用 H.264 编码器'-crf', '18',  # 设置 CRF 值'-preset', 'slow',  # 设置编码速度/质量权衡'-b:v', '5000k',  # 设置视频比特率'-c:a', 'copy',  # 复制音频流output_file  # 输出文件]# 执行命令try:subprocess.run(command, check=True)except subprocess.CalledProcessError as e:print(f"Error executing FFmpeg: {e}")except FileNotFoundError as e:print(f"FFmpeg not found: {e}")def batch_crop_videos(input_folder, output_folder, x1, y1, x2, y2):# 确保输出文件夹存在if not os.path.exists(output_folder):os.makedirs(output_folder)# 遍历输入文件夹中的所有文件for filename in os.listdir(input_folder):if filename.endswith(('.wmv', '.mp4', '.avi', '.mkv')):  # 支持的视频格式input_file = os.path.join(input_folder, filename)# 生成输出文件路径,统一为 .mp4 格式output_filename = os.path.splitext(filename)[0] + '.mp4'output_file = os.path.join(output_folder, output_filename)print(f"Cropping {input_file} to {output_file}")crop_video(input_file, output_file, x1, y1, x2, y2)def main():# 创建 Tkinter 窗口root = tk.Tk()root.withdraw()  # 隐藏主窗口# 选择输入文件夹input_folder = filedialog.askdirectory(title="Select Input Folder")if not input_folder:print("No input folder selected. Exiting.")return# 选择输出文件夹output_folder = filedialog.askdirectory(title="Select Output Folder")if not output_folder:print("No output folder selected. Exiting.")return# 设置裁剪区域坐标x1 = 250  # 左上角 X 坐标y1 = 137  # 左上角 Y 坐标x2 = 1030  # 右下角 X 坐标y2 = 820  # 右下角 Y 坐标batch_crop_videos(input_folder, output_folder, x1, y1, x2, y2)if __name__ == "__main__":main()

打包命令pyinstaller --onefile --add-binary "ffmpeg-win64-v4.2.2.exe;." main.py

5. 总结

通过上述步骤,我们可以将一个使用 FFmpeg 进行视频裁剪的 Python 脚本打包成独立的可执行文件,并确保在没有安装 FFmpeg 的计算机上能够正常运行。希望本文对你有所帮助。如果有任何问题或建议,请随时留言交流。

相关文章:

数据脱敏工具:基于 FFmpeg 的视频批量裁剪

在数据处理和隐私保护领域,数据脱敏是一项重要的任务,尤其是在处理包含敏感信息的视频数据时。本文介绍了一种使用 Python 和 FFmpeg 实现的视频批量裁剪工具,该工具可以将视频中的敏感区域裁剪掉,从而实现数据脱敏。通过使用 PyI…...

Debezium日常分享系列之:Debezium3版本Debezium connector for JDBC

Debezium日常分享系列之:Debezium3版本Debezium connector for JDBC 概述JDBC连接器的工作原理消费复杂的Debezium变更事件至少一次的传递多个任务数据和列类型映射主键处理删除模式幂等写入模式演化引用和大小写敏感性连接空闲超时数据类型映射部署Debezium JDBC连…...

「Mac玩转仓颉内测版24」基础篇4 - 浮点类型详解

本篇将详细介绍 Cangjie 中的浮点类型,包括浮点数的表示方法、精度、舍入与溢出处理、科学计数法表示、字面量的进制表示、常用运算、类型转换及应用场景,帮助开发者掌握浮点数的使用方法。 关键词 浮点类型表示精度与舍入溢出与下溢科学计数法类型转换…...

【UGUI】Unity 背包系统实现02:道具信息提示与显示

在游戏开发中,背包系统是一个常见的功能模块,用于管理玩家拾取的物品。本文将详细介绍如何在 Unity 中实现一个简单的背包系统,包括道具信息的提示和显示功能。我们将通过代码和场景搭建来逐步实现这一功能。 1. 功能需求清单 在实现背包系…...

掌握移动端性能测试利器:深入JMeter手机录制功能

引言 在当今移动互联网时代,应用程序的性能和用户体验至关重要。为了确保应用程序在不同设备和网络环境下都能稳定运行,性能测试成为了不可或缺的一环。Apache JMeter作为一款强大的开源性能测试工具,不仅支持传统的PC端性能测试&#xff0c…...

springboot010大学生入学审核系统的设计与实现(源码+包运行+LW+技术指导)

项目描述 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本站是一个B/S模式系统,采用Spring Boot框架,MYSQL数据库设计开发,充分保证系统的稳定性。系统具有界面清晰、操作简单&#xff0c…...

Qt/C++离线地图的加载和交互/可以离线使用/百度和天地图离线/支持手机上运行

一、前言说明 在地图应用中,有很多时候是需要断网环境中离线使用的,一般会采用两种做法,一种是只下载好离线瓦片地图,然后根据不同的缩放和经纬度坐标绘制瓦片。这种方式优点是任何地图都支持,只需要拿到瓦片即可&…...

从繁琐到优雅:用 PyTorch Lightning 简化深度学习项目开发

从繁琐到优雅:用 PyTorch Lightning 简化深度学习项目开发 在深度学习开发中,尤其是使用 PyTorch 时,我们常常需要编写大量样板代码来管理训练循环、验证流程和模型保存等任务。PyTorch Lightning 作为 PyTorch 的高级封装库,帮助…...

UE5 第一人称射击项目学习(完结)

这个项目几乎完结了。 也算我上手的第一个纯蓝图小项目。 现在只剩下缝缝补补了。 之前把子弹设计为蓝图,这里要引入C的面向对象思想,建立成员函数。 首先双击打开子弹的蓝图 这边就可以构造成员函数 写一个print your name 在这里生成成员函数后&am…...

Banana Pi BPI-CanMV-K230D-Zero 采用嘉楠科技 K230D RISC-V芯片设计

概述 Banana Pi BPI-CanMV-K230D-Zero 采用嘉楠科技 K230D RISC-V芯片设计,探索 RISC-V Vector1.0 的前沿技术,选择嘉楠科技的 Canmv K230D Zero 开发板。这款创新的开发板是由嘉楠科技与香蕉派开源社区联合设计研发,搭载了先进的勘智 K230D 芯片。 K230…...

【vim】使用 gn 组合命令实现搜索选中功能

gn是Vim 7.4新增的一个操作(motion),作用是跳到并选中下一个搜索匹配项。 具体说,Vim里执行搜索后,执行n操作只会跳转到下一个匹配项,而不选中它。但是我们往往需要对匹配项执行一些修改操作,例…...

【Python刷题】广度优先搜索相关问题

题目描述 小A与小B 算法思路 小A一次移动一步,但有八个方向,小B一次移动两步,只有四个方向,要求小A和小B最早的相遇时间。用两个队列分别记录下小A和小B每一步可以走到的位置,通过一个简单的bfs就能找到这些位置并…...

竞赛思享会 | 2024年第十届数维杯国际数学建模挑战赛D题【代码+演示】

Hello,这里是Easy数模!以下idea仅供参考,无偿分享! 题目背景 本题旨在通过对中国特定城市的房产、人口、经济、服务设施等数据进行分析,评估其在应对人口老龄化、负增长趋势和极端气候事件中的韧性与可持续发展能力。…...

早期超大规模语言模型的尝试——BLOOM模型论文解读,附使用MindSpore和MindNLP的模型和实验复现

背景 预训练语言模型已经成为了现代自然语言处理pipeline中的基石,因为其在少量的标注数据上产生更好的结果。随着ELMo、ULMFiT、GPT和BERT的开发,使用预训练模型在下游任务上微调的范式被广泛使用。随后发现预训练语言模型在没有任何额外训练的情况下任…...

二分查找题目:有序数组中的单一元素

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题:有序数组中的单一元素 出处:540. 有序数组中的单一元素 难度 4 级 题目描述 要求 给定一个仅由整数…...

springboot基于Android的华蓥山旅游导航系统

摘 要 华蓥山旅游导航系统是一款专为华蓥山景区设计的智能导览应用,旨在为用户提供便捷的旅游信息服务。该系统通过整合华蓥山的地理信息、景点介绍、交通状况等数据,实现了对景区的全面覆盖。用户可以通过该系统获取实时的旅游资讯、交流论坛、地图等。…...

面向对象编程(OOP)深度解析:思想、原则与应用

🚀 作者 :“码上有前” 🚀 文章简介 :Java 🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬 面向对象编程(OOP)深度解析:思想、原则与应用 一、面向对象编程的基本…...

iPhone 17 Air看点汇总:薄至6mm 刷新苹果轻薄纪录

我们姑且将这款iPhone 17序列的超薄SKU称为“iPhone 17 Air”,Jeff Pu在报告中提到,我同意最近关于 iPhone 17超薄机型采用6 毫米厚度超薄设计的传言。 如果这一测量结果被证明是准确的,那么将有几个值得注意的方面。 首先,iPhone…...

「OpenCV交叉编译」ubuntu to arm64

Ubuntu x86_64 交叉编译OpenCV 为 arm64OpenCV4.5.5、cmake version 3.16.3交叉编译器 gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu 可在arm或linaro官网下载所需版本,本文的交叉编译器可点击链接跳转下载 Downloads | GNU-A Downloads – Arm Developer L…...

Stable Diffusion的解读(二)

Stable Diffusion的解读(二) 文章目录 Stable Diffusion的解读(二)摘要Abstract一、机器学习部分1. 算法梳理1.1 LDM采样算法1.2 U-Net结构组成 2. Stable Diffusion 官方 GitHub 仓库2.1 安装2.2 主函数2.3 DDIM采样器2.4 Unet 3…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

【Oracle APEX开发小技巧12】

有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

Qt 事件处理中 return 的深入解析

Qt 事件处理中 return 的深入解析 在 Qt 事件处理中&#xff0c;return 语句的使用是另一个关键概念&#xff0c;它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别&#xff1a;不同层级的事件处理 方…...