数据脱敏工具:基于 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…...
2025届必备的十大降重复率助手实测分析
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 针对维普系统有的AI检测机制,要是想降低生成文本的机器特征,那就得从…...
2026届最火的AI论文助手推荐榜单
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 要想切实有效地把文本的AIGC检测概率给降低下去,就得从词汇多样性、句式结构以及…...
OpenClaw v2026.4.2 深度解读:插件边界继续外移,Task Flow 真正走向可持久化运维
🔥个人主页:杨利杰YJlio❄️个人专栏:《Sysinternals实战教程》《Windows PowerShell 实战》《WINDOWS教程》《IOS教程》《微信助手》《锤子助手》 《Python》 《Kali Linux》《那些年未解决的Windows疑难杂症》🌟 让复杂的事情更…...
Python 中的数据结构与算法:从基础到应用
Python 中的数据结构与算法:从基础到应用 1. 背景介绍 数据结构与算法是计算机科学的核心基础,它们决定了程序的效率和性能。在 Python 中,掌握常用的数据结构和算法不仅可以提高代码质量,还能解决复杂问题。本文将深入探讨 Pytho…...
2025最权威的五大降重复率工具推荐榜单
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 基于自然语言处理以及机器学习算法的AI论文查重系统,会去分析文本语义࿰…...
ECC 深度解析:怎么让 AI 代理变身你的金牌码农
每天免费领 1亿 Token,白嫖DeepSeek、GLM、MiniMax、Kimi等大模型! 故事要从一场黑客松说起 2026 年初,在 Anthropic 和 Cerebral Valley 联手搞的那场黑客松上,一个名叫 Everything Claude Code(简称 ECC࿰…...
双buck电路并联(VDCM控制+下垂控制) 变换器并联控制方案中,下垂控制是一种经典的控制策略
双buck电路并联(VDCM控制下垂控制) 变换器并联控制方案中,下垂控制是一种经典的控制策略,但下垂控制因缺少传统电机的阻尼和旋转惯量以及励磁暂态特性,因此在负载功率变化时,输出电压更容易受到影响 随着交…...
告别手动移植!用ESP-IDF组件化方式管理你的Gui-Guider UI代码
告别手动移植!用ESP-IDF组件化方式管理你的Gui-Guider UI代码 在ESP32开发中,GUI界面的构建往往需要耗费大量精力。当使用LVGL配合Gui-Guider这样的可视化设计工具时,如何高效管理生成的UI代码成为提升开发效率的关键。本文将带你探索一种更优…...
零基础入门:星图平台私有化部署Qwen3-VL:30B,Clawdbot飞书接入完整指南
零基础入门:星图平台私有化部署Qwen3-VL:30B,Clawdbot飞书接入完整指南 1. 项目概述与准备工作 1.1 为什么选择Qwen3-VL:30B? Qwen3-VL:30B是目前最强的多模态大模型之一,具备以下核心优势: 强大的视觉理解能力&am…...
LSPatch免Root框架完全指南:3大实用场景与高效上手教程
LSPatch免Root框架完全指南:3大实用场景与高效上手教程 【免费下载链接】LSPatch LSPatch: A non-root Xposed framework extending from LSPosed 项目地址: https://gitcode.com/gh_mirrors/ls/LSPatch LSPatch是一款基于LSPosed框架的非Root实现方案&#…...
