[1214]基于Python实现视频去重
文章目录videohash2️ 安装 基本用法 比较视频如何判断相似 进阶用法⚠️ 使用限制 与另一个分支的区别基于Python实现视频去重基本原理实现方法其它视频去重codevideohash2https://github.com/akamhy/videohashhttps://github.com/Demmenie/videohash2在开始之前请确保你的电脑已经安装了FFmpeg这是它正常工作的基础。️ 安装最推荐的方式是通过 pip 从 PyPI 安装pipinstallvideohash2如果安装失败可以尝试加上--prefer-binary选项。 基本用法videohash2的核心是VideoHash类。它可以处理本地视频文件路径或网络URL比如YouTube链接。fromvideohash2importVideoHash# 1. 从URL创建哈希video_hash_1VideoHash(urlhttps://example.com/video.mp4)# 2. 从本地文件路径创建哈希video_hash_2VideoHash(path/path/to/your/local/video.mp4) 比较视频如何判断相似这是它的核心功能。你可以计算两个视频哈希值的“距离”来判断相似度距离越小视频越相似。# 假设 video_hash_1 和 video_hash_2 已经创建好# 方法一计算“海明距离” (Hamming Distance)# 计算两个哈希值有多少位不同结果为整数0表示完全一致distancevideo_hash_1-video_hash_2print(f视频间的距离是:{distance})# 方法二使用内置的相似度判断# 返回 True 或 False内部使用了一个默认的阈值来判断是否相似is_similarvideo_hash_1.is_similar(video_hash_2)print(f两个视频是否相似:{is_similar})# 你还可以直接用 判断是否完全一致is_identical(video_hash_1video_hash_2)print(f两个视频是否完全一致:{is_identical}) 进阶用法调整采样帧率通过frame_interval参数控制每秒提取多少帧数值越大计算越精确但耗时也更长。默认是每秒1帧。# 每5秒提取1帧 (0.2 fps)video_hashVideoHash(pathvideo.mp4,frame_interval0.2)# 每秒提取5帧 (5 fps)video_hashVideoHash(pathvideo.mp4,frame_interval5)管理临时文件VideoHash在计算过程中会下载视频或创建临时文件可以通过storage_path指定存放目录防止撑爆系统临时文件夹。video_hashVideoHash(url...,storage_path/my/big/drive/video_cache)# 处理完后可以手动调用删除临时文件video_hash.delete_storage_path()⚠️ 使用限制这个工具的设计目标并不是视频指纹识别所以有一些场景它不适用它不能判断一个视频是否是另一个视频的一部分。如果视频被反转播放或旋转了超过10度哈希值可能会发生较大变化导致无法识别为相似视频。 与另一个分支的区别搜索时你可能还会看到一个叫videohash(不带2) 的库它是videohash2的前身。videohash2是最新版修复了旧版的一些问题建议直接使用videohash2。基于Python实现视频去重基本原理一款基于Python语言的视频去重复程序它可以根据视频的特征参数将重复的视频剔除以减少视频的存储空间。它的基本原理是首先利用Python语言对视频文件进行解析提取视频的特征参数如帧率、码率等然后根据特征参数生成视频的哈希值最后将每个视频的哈希值进行对比如果哈希值相同则表示视频内容相同可以将其中一个视频剔除以节省存储空间。实现方法基于Python实现视频去重小工具需要使用Python语言的一些第三方库如OpenCV、PIL等。实现的基本步骤如下1、首先使用OpenCV库对视频文件进行解析提取视频的特征参数2、然后使用PIL库将视频的每一帧转换为灰度图片计算每一帧图片的哈希值3、最后将每个视频的哈希值进行对比如果哈希值相同则表示视频内容相同可以将其中一个视频剔除。示例代码import cv2 from PIL import Image # 读取视频文件 video_file video.mp4 cap cv2.VideoCapture(video_file) # 提取视频的特征参数 frame_rate cap.get(cv2.CAP_PROP_FPS) frame_width cap.get(cv2.CAP_PROP_FRAME_WIDTH) frame_height cap.get(cv2.CAP_PROP_FRAME_HEIGHT) # 计算每一帧图片的哈希值 while True: # 读取每一帧图片 success, frame cap.read() if not success: break # 将图片转换为灰度图 gray_frame cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 计算图片的哈希值 image Image.fromarray(gray_frame) hash_value image.hash() # 将哈希值进行对比如果哈希值相同则表示视频内容相同 if hash_value other_hash_value: # 剔除重复视频 pass # 释放视频文件 cap.release()其它视频去重code同级目录下新建dup_video# -*- coding:utf-8 -*- import json import os import shutil import cv2 import imagehash from PIL import Image from loguru import logger from PySimpleGUI import popup_get_folder class VideoDuplicate(object): 返回整个视频的图片指纹列表 从1秒开始每3秒抽帧计算一张图像指纹 def __init__(self): self._over_length_video: list [] self._no_video: list [] def _video_hash(self, video_path) - list: param video_path - 视频绝对路径; hash_arr [] cap cv2.VideoCapture(video_path) ##打开视频文件 logger.info(f开始抽帧【{video_path}】) n_frames int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) # 视频的帧数 logger.warning(f视频帧数:{n_frames}) fps cap.get(cv2.CAP_PROP_FPS) # 视频的帧率 logger.warning(f视频帧率:{fps}) dur n_frames / fps * 1000 # 视频大致总长度 cap_set 1000 logger.warning(f视频大约总长:{dur / 1000}) if dur // 1000 11: logger.error(f视频时长超出规定范围【6~10】;当前时长:【{dur // 1000}】;跳过该视频;) self._over_length_video.append(video_path) return [] while cap_set dur: # 从3秒开始每60秒抽帧计算图像指纹。总长度-3s是因为有的时候计算出来的长度不准。 cap.set(cv2.CAP_PROP_POS_MSEC, cap_set) logger.debug(f开始提取:【{cap_set // 1000}】/s的图片;) # 返回该时间点的图像(numpy数组)及读取是否成功 success, image_np cap.read() if success: img Image.fromarray(cv2.cvtColor(image_np, cv2.COLOR_BGR2RGB)) # 转成cv图像格式 h str(imagehash.dhash(img)) logger.success(f【{cap_set}/s图像指纹:【{h}】) hash_arr.append(h) # 图像指纹 else: logger.error(str(cap_set / 1000)) cap_set 1000 * 2 cap.release() # 释放视频 return hash_arr def start(self, base_dir): param base_dir - 主文件路径; data: list [] for video in os.listdir(base_dir): logger.debug(f- * 80) name, ext os.path.splitext(video) if ext not in (.mp4, .MP4): logger.error(f视频文件格式不符;【{video}】;执行跳过;) continue abs_video_path os.path.join(base_dir, video) video_hash_list self._video_hash(abs_video_path) if video_hash_list: data.append({video_abs_path: abs_video_path, hash: video_hash_list}) self._write_log(data) return data staticmethod def _write_log(data: list) - None: 视频哈希后的值写入日志文件 with open(flog.txt, w, encodingutf-8) as f: f.write(json.dumps(data)) def __call__(self, base_dir, *args, **kwargs): self.start(base_dir) logger.debug(f-----------------------------------开始比对关键帧差值感知余弦算法-----------------------------) with open(log.txt) as f: data json.loads(f.read()) for i in range(0, len(data) - 1): for j in range(i 1, len(data)): if data[i][hash] data[j][hash]: _, filename os.path.split(data[i][video_abs_path]) logger.error(f移动文件:【{filename}】) shutil.move( os.path.join(base_dir, filename), os.path.join(os.path.join(os.getcwd(), dup_video), filename) ) logger.warning(---------------------超长视频----------------------) for i in self._over_length_video: _, name os.path.split(i) logger.error(name) def main(): path popup_get_folder(请选择[视频去重]文件夹) v VideoDuplicate() v(path) if __name__ __main__: main()参考https://blog.csdn.net/weixin_44634704/article/details/128563576https://fiime.cn/blog/202363

相关新闻

终极免费跨平台智能下载器:3分钟上手获取视频号、抖音、快手等全网资源

终极免费跨平台智能下载器:3分钟上手获取视频号、抖音、快手等全网资源

终极免费跨平台智能下载器:3分钟上手获取视频号、抖音、快手等全网资源 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader…

2026/8/6 17:40:34 阅读更多 →
搭建drupal门户网站的详细步骤

搭建drupal门户网站的详细步骤

1.安装 Apache,MySQL 和 PHP。在 Ubuntu 22.04 上安装 LAMP 资源包,请终端使用以下命令: sudo apt update sudo apt upgrade (1)安装Apache2 sudo apt-get install apache2 安装php组件 sudo apt-get install php l…

2026/8/6 17:40:34 阅读更多 →
linux系统下搭建dvwa靶场的详细过程

linux系统下搭建dvwa靶场的详细过程

1.安装 Apache,MySQL 和 PHP。在 Ubuntu 22.04 上安装 LAMP 资源包,请终端使用以下命令: 更新系统 sudo apt update && sudo apt upgrade ##更新系统 安装Apache2 sudo apt-get install apache2 2.安装php组件 sudo apt-get …

2026/8/6 17:40:34 阅读更多 →

最新新闻

ppInk:Windows平台上最强大的免费屏幕标注软件终极指南

ppInk:Windows平台上最强大的免费屏幕标注软件终极指南

ppInk:Windows平台上最强大的免费屏幕标注软件终极指南 【免费下载链接】ppInk Fork from Gink 项目地址: https://gitcode.com/gh_mirrors/pp/ppInk 你是否经常需要在屏幕演示、在线教学或远程协作中进行实时标注?是否厌倦了复杂的绘图工具和繁琐…

2026/8/6 18:29:57 阅读更多 →
私有化部署即时通讯软件,哪类企业最需要?

私有化部署即时通讯软件,哪类企业最需要?

如果银行的内部投资研报、军工单位的试验数据、制造工厂的工艺图纸、软件公司的核心代码,全部存放在第三方公有云服务器上——这意味着数据主权旁落,泄密风险不可控。市面上绝大多数IM软件采用公有云SaaS模式,所有聊天记录与传输文件默认保存…

2026/8/6 18:29:57 阅读更多 →
跨平台重复文件清理工具终极指南:Czkawka/Krokiet完整教程

跨平台重复文件清理工具终极指南:Czkawka/Krokiet完整教程

跨平台重复文件清理工具终极指南:Czkawka/Krokiet完整教程 【免费下载链接】czkawka Multi functional app to find duplicates, empty folders, similar images etc. 项目地址: https://gitcode.com/GitHub_Trending/cz/czkawka 还在为电脑里堆积如山的重复…

2026/8/6 18:29:57 阅读更多 →
如何用这款歌词管理工具彻底告别音乐无字幕时代?终极指南让你3分钟上手![特殊字符]

如何用这款歌词管理工具彻底告别音乐无字幕时代?终极指南让你3分钟上手![特殊字符]

如何用这款歌词管理工具彻底告别音乐无字幕时代?终极指南让你3分钟上手!🎵 【免费下载链接】163MusicLyrics 云音乐歌词获取处理工具【网易云、QQ音乐】 项目地址: https://gitcode.com/GitHub_Trending/16/163MusicLyrics 你是否曾经…

2026/8/6 18:29:57 阅读更多 →
如何实现隐私安全的离线音频转录?Buzz本地AI语音识别工具终极指南

如何实现隐私安全的离线音频转录?Buzz本地AI语音识别工具终极指南

如何实现隐私安全的离线音频转录?Buzz本地AI语音识别工具终极指南 【免费下载链接】buzz Buzz transcribes and translates audio offline on your personal computer. Powered by OpenAIs Whisper. 项目地址: https://gitcode.com/GitHub_Trending/buz/buzz …

2026/8/6 18:29:57 阅读更多 →
3步玩转Reloaded-II:零基础开启你的游戏模组之旅

3步玩转Reloaded-II:零基础开启你的游戏模组之旅

3步玩转Reloaded-II:零基础开启你的游戏模组之旅 【免费下载链接】Reloaded-II Universal .NET Core Powered Modding Framework for any Native Game X86, X64. 项目地址: https://gitcode.com/gh_mirrors/re/Reloaded-II 你是否曾经为心爱的游戏寻找新玩法…

2026/8/6 18:28:56 阅读更多 →

日新闻

深入解析LimboAI C++内核:架构设计与性能优化实战

深入解析LimboAI C++内核:架构设计与性能优化实战

1. 项目概述:为什么我们需要深入LimboAI的C内核?如果你是一名使用Godot引擎的游戏开发者,尤其是对AI行为逻辑有较高要求的项目,那么LimboAI这个名字你大概率不会陌生。它作为Godot 4生态中一个备受瞩目的行为树与状态机插件&#…

2026/8/6 0:00:06 阅读更多 →
Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

1. 项目概述与核心思路大家好,我是老张,一个在游戏开发一线摸爬滚打了十多年的老码农。今天咱们接着聊《空洞骑士》风格2D动作游戏的Demo制作。上一期我们搭好了基础框架,处理了角色移动和碰撞,这一期,我们要让游戏世界…

2026/8/6 0:00:06 阅读更多 →
被动防火门市场前景发展趋势

被动防火门市场前景发展趋势

被动防火门依靠材质结构、密闭构造阻隔烟火蔓延,无需电控启动,是建筑被动消防系统核心构件,行业依托新规管控、城市更新、工业安全升级迎来稳定扩容,整体朝着合规化、专项化、低碳化、智能化方向发展。现阶段 GB12955‑2024 新版国…

2026/8/6 0:00:06 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/5 15:00:43 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/5 13:13:56 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/5 10:20:36 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/5 23:28:39 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/5 21:00:14 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/5 23:46:51 阅读更多 →