数据脱敏工具:基于 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端性能测试,…...
springboot010大学生入学审核系统的设计与实现(源码+包运行+LW+技术指导)
项目描述 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本站是一个B/S模式系统,采用Spring Boot框架,MYSQL数据库设计开发,充分保证系统的稳定性。系统具有界面清晰、操作简单,…...
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…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...
day36-多路IO复用
一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...
