[原创]使用python对视频/音频文件进行详细信息采集,并进行去重操作

转载请注明出处

一.关于为什么用pymediainfo以及pymediainfo的安装

  使用python对视频/音频文件进行详细信息采集,并进行去重操作的核心是使用pymediainfo这个库

  之前本人一直在试着用moviepy库中的VideoFileClip来获取视频/音频文件的详细信息,但效果不理想,一直报错根本无法解决.

  直到本人发现了pymediainfo这个库,问题才得到解决(pymediainfo可以获取极其详细的音频/视频文件的具体信息).

  pymediainfo的安装:(参考https://www.jianshu.com/p/4c115bd82774)

    1.pip install pymediainfo  或者 python -m pip install pymediainfo

    2.然后到官网下载该程序,(官网地址: https://pypi.org/project/pymediainfo/),安装到指定文件夹

    3.特别重要的一步:到你安装pymediainfo的文件夹中找到MediaInfo.dll这个文件,把它复制到你Python的根目录下(不复制程序会报无法打开xx程序的错!)

二.视频/音频去重的简单逻辑:

  如果两个视频/音频文件的大小完全一致,而且时长也完全一致,则该两个文件极有可能是重复的.

三.代码实现:

  下面代码你只需要把

    file_dir = r"D:\Movie\180919"  
    dire_dir = r'D:\Movie\BBB'

  更改成你自己的绝对路径就可以了(file_dir是你视频/音频文件的目录, dire_dir是将重复视频文件移动至的目录,程序结束后file_dir目录中的重复文件会被移动到dire_dir)

  注意:file_dir路径里只能放音频,视频文件,放入其他文件可能会报错(本人只考虑了file_dir中只有视频/音频文件的情况)

  程序功能:8G内存IE7处理器能处理11000个,大约2000G的视频/音频文件去重工作,花费时间30~40分钟(程序执行with open操作后会巨卡5-10分钟)

 import os
import shutil from pymediainfo import MediaInfo file_dir = r"D:\Movie\180919"  # 定义文件目录(需要自己添加文件的绝对路径)
dire_dir = r'D:\Movie\BBB' # 目标路径,将可能重复的文件移动至此(需要自己添加文件的绝对路径)
video_sumlist = [] # 全音/视频文件列表(绝对路径)
video_detail_list = [] # 全音/视频文件详细信息列表
video_info_list = [] # 只记录需要的关键信息
count = 0 # 用于记录已处理的文件数量 def get_all_file(f_dir): # 获取文件名称与文件大小,以方便使用MediaInfo库遍历获取视频/音频文件的超详细信息
for root, dirs, files in os.walk(f_dir, topdown=True): # root就是"D:\Movie\180919", dirs 为[], files为全部文件列表
for name in files:
video_sumlist.append(os.path.join(root, name)) get_all_file(file_dir)
# print(video_sumlist) for i in video_sumlist: # 获取视频/音频文件的详细信息并存储到video_detail_list中
media_info = MediaInfo.parse(i)
data = media_info.to_data()
video_detail_list.append(data)
count+=1
print("执行完第%d条数据...,视频名称为:%s"%(count, data["tracks"][0]["other_file_name"])) with open(r"./video_detail.py", "w", encoding='utf-8') as f: # 因为遍历上万文件太费时,需要将视频/音频信息存储在文件中,以减少程序执行时间
print("开始执行写入操作...")
f.write(str(video_detail_list)) with open(r"./video_detail.py", "r", encoding='utf-8') as f: # 将存储在file文件中的信息读取到vfile中
print("开始执行读取操作...")
vfile = eval(f.read())
print(type(vfile)) for elem in vfile: # 简化文件信息的列表格式: [{文件名: {"t_size": t_size, "v_duration": v_duration}}, {{文件名: {"t_size": t_size, "v_duration": v_duration}}]
# print('v_size: ', elem["tracks"][0]["file_size"])
# print('v_duration: ', elem["tracks"][0]["duration"])
try:
if elem["tracks"][0]["file_name"] != 'desktop.ini':
video_info_list.append({(elem["tracks"][0]["other_file_name"][0]+"."+elem["tracks"][0]["file_extension"]):\
{"v_size": elem["tracks"][0]["file_size"], "v_duration": elem["tracks"][0]["duration"]}})
else:
print("找到了隐藏文件desktop.ini, 它没有'duration'这个键值对,需要跳过...")
except KeyError:
print("找到一个隐藏文件,该文件名为: ", elem["tracks"][0]["file_name"])
print(video_info_list)
print(video_info_list[0].keys()) # dict_keys(['海阔天空.mp4'])
print(type(video_info_list[0].keys())) # <class 'dict_keys'> start_index = 0
tomove_list = []
while start_index < (len(video_info_list)-1):
find_index = start_index + 1
# print("start_index = ", start_index, "find_index = ", find_index)
# print(list(video_info_list[start_index].values()))
# print(list(video_info_list[start_index].values())[0]["v_size"])
# print(list(video_info_list[start_index].values())[0]["v_duration"])
sample0 = [list(video_info_list[start_index].values())[0]["v_size"], list(video_info_list[start_index].values())[0]["v_duration"]]
while find_index < len(video_info_list):
if sample0[0] == list(video_info_list[find_index].values())[0]["v_size"] and \
sample0[1] == list(video_info_list[find_index].values())[0]["v_duration"]:
tomove_list.append(find_index)
find_index += 1
else:
find_index += 1 # 外层循环开始:
if tomove_list != []:
tomove_list.reverse()
print("to move list after reverse: ", tomove_list)
for tomove_item in tomove_list:
shutil.move(os.path.join(file_dir ,list(video_info_list[tomove_item].keys())[0]), dire_dir)
video_info_list.pop(tomove_item) # 非常重要,保证video_info_list与实际音频/视频数据一致
print("已经移除文件的编号为: ", tomove_item)
start_index += 1
tomove_list = []

完~

[原创]使用python对视频/音频文件进行详细信息采集,并进行去重操作的更多相关文章

  1. php-ffmpeg 操作视频/音频文件

    php-ffmpeg 是一个php操作视频/音频文件的类库. GitHub地址:https://github.com/PHP-FFMpeg/PHP-FFMpeg/ 使用composer快速安装:com ...

  2. (原创)speex与wav格式音频文件的互相转换

    我们的司信项目又有了新的需求,就是要做会议室.然而需求却很纠结,要继续按照原来发语音消息那样的形式来实现这个会议的功能,还要实现语音播放的计时,暂停,语音的拼接,还要绘制频谱图等等. 如果是wav,m ...

  3. (原创)speex与wav格式音频文件的互相转换(二)

    之前写过了如何将speex与wav格式的音频互相转换,如果没有看过的请看一下连接 http://www.cnblogs.com/dongweiq/p/4515186.html 虽然自己实现了相关的压缩 ...

  4. 【原创】python实现视频内的face swap(换脸)

    1.准备工作,按博主的环境为准 Python 3.5 Opencv 3 Tensorflow 1.3.1 Keras 2 cudnn和CUDA,如果你的GPU足够厉害并且支持的话,可以选择安装 那就先 ...

  5. python 读取wav 音频文件的两种方式

    python 中,常用的有两种可以读取wav音频格式的方法,如下所示: import scipy from scipy.io import wavfile import soundfile as sf ...

  6. 【部分原创】python实现视频内的face swap(换脸)

    1.准备工作,按博主的环境为准 Python 3.5 Opencv 3 Tensorflow 1.3.1 Keras 2 cudnn和CUDA,如果你的GPU足够厉害并且支持的话,可以选择安装 那就先 ...

  7. 【Python】[IO编程]文件读写,StringIO和BytesIO,操作文件和目录,序列化

    IO在计算机中指Input/Output,也就是输入和输出. 1.文件读写,1,读文件[使用Python内置函数,open,传入文件名标示符] >>> f = open('/User ...

  8. [Python]获取win平台文件的详细信息

    import win32api def getFileProperties(fname): """ 读取给定文件的所有属性, 返回一个字典. ""&q ...

  9. python脚本实现音频m4a格式转成MP3格式

    群里看到有人询问:谁会用python将微信音频文件后缀m4a格式转成mp3格式,毫不犹豫回了句:我会.然后就私下聊起来了 解决方法介绍如下: 工具:windows系统,python2.7,转换库ffm ...

随机推荐

  1. Echarts同一页面多个图表自适应浏览器窗口大小——window.onresize

    当前做的一个项目中,频繁使用到百度团队的Echarts,发在一个页面同时出现多个图表时,只有最后一个图表触发了window.onresize事件,查询官方文档后得到解决. 方法如下: hwChart. ...

  2. java 基础 01 变量和注释、数据类型

    1,变量和注释 比如:姓名:xiaoming 年龄:18 1.1变量的基本概念 当需要在程序中记录单个数据内容时,则需要声明一个变量来处理,而变量的本质就是内存中申请一块存储单元用于存储数据内容,由于 ...

  3. Flask蓝图的增删改查

    怎样用flask蓝图来实现增删改查呢?请看下面的内容 这是我们的目录结构 从图中可以看出每一个功能都有一个各自的文件夹 首先我们要自己先来创建一个数据,在Flask_data.py中写入如下内容: S ...

  4. js技巧-使用reduce实现更简洁的数组对象去重和数组扁平化

    Array.prototype.reduce()方法介绍: 感性认识reduce累加器: const arr = [1, 2, 3, 4]; const reducer = (accumulator, ...

  5. Java集合框架—Map

    Map集合:该集合存储键值对.一对一对往里存.而且要保证键的唯一性. 1,添加. put(K key, V value)  putAll(Map<? extends K,? extends V& ...

  6. 安装express

    就目前来说安装express需要走几个步骤,要不就会出现在检查版本的时候就会出现,expres不是内部的命令或者是这种 安装的步骤: 1. 先是输入npm install -g express-gen ...

  7. UVA 11600 Masud Rana(概率dp)

    当两个城市之间有安全的道路的时候,他们是互相可到达的,这种关系满足自反.对称和传递性, 因此是一个等价关系,在图论中就对应一个连通块. 在一个连通块中,当前点是那个并不影响往其他连通块的点连边,因此只 ...

  8. hdu-3572 Task Schedule---最大流判断满流+dinic算法

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3572 题目大意: 给N个任务,M台机器.每个任务有最早才能开始做的时间S,deadline E,和持 ...

  9. 第六十三课、C语言的异常处理

    http://www.cnblogs.com/gui-lin/p/6379101.html 一.异常处理 1.异常的概念 (1).程序在运行过程中可能产生异常 (2).异常(Exception)和Bu ...

  10. 【BZOJ3460】Jc的宿舍(树上莫队+树状数组)

    点此看题面 大致题意: 一棵树,每个节点有一个人,他打水需要\(T_i\)的时间,每次询问两点之间所有人去打水的最小等待时间. 伪·强制在线 这题看似强制在线,但实际上,\(pre\ mod\ 2\) ...