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

[原创]使用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分钟)

1 importos2 importshutil3

4 from pymediainfo importMediaInfo5

6

7 file_dir = r"D:\Movie\180919"  #定义文件目录(需要自己添加文件的绝对路径)

8 dire_dir = r'D:\Movie\BBB' #目标路径,将可能重复的文件移动至此(需要自己添加文件的绝对路径)

9 video_sumlist = [] #全音/视频文件列表(绝对路径)

10 video_detail_list = [] #全音/视频文件详细信息列表

11 video_info_list = [] #只记录需要的关键信息

12 count = 0 #用于记录已处理的文件数量

13

14 def get_all_file(f_dir): #获取文件名称与文件大小,以方便使用MediaInfo库遍历获取视频/音频文件的超详细信息

15 for root, dirs, files in os.walk(f_dir, topdown=True): #root就是"D:\Movie\180919", dirs 为[], files为全部文件列表

16 for name infiles:17 video_sumlist.append(os.path.join(root, name))18

19 get_all_file(file_dir)20 #print(video_sumlist)

21

22 for i in video_sumlist: #获取视频/音频文件的详细信息并存储到video_detail_list中

23 media_info =MediaInfo.parse(i)24 data =media_info.to_data()25 video_detail_list.append(data)26 count+=1

27 print("执行完第%d条数据...,视频名称为:%s"%(count, data["tracks"][0]["other_file_name"]))28

29

30 with open(r"./video_detail.py", "w", encoding='utf-8') as f: #因为遍历上万文件太费时,需要将视频/音频信息存储在文件中,以减少程序执行时间

31 print("开始执行写入操作...")32 f.write(str(video_detail_list))33

34 with open(r"./video_detail.py", "r", encoding='utf-8') as f: #将存储在file文件中的信息读取到vfile中

35 print("开始执行读取操作...")36 vfile =eval(f.read())37 print(type(vfile))38

39 for elem in vfile: #简化文件信息的列表格式: [{文件名: {"t_size": t_size, "v_duration": v_duration}}, {{文件名: {"t_size": t_size, "v_duration": v_duration}}]

40 #print('v_size: ', elem["tracks"][0]["file_size"])

41 #print('v_duration: ', elem["tracks"][0]["duration"])

42 try:43 if elem["tracks"][0]["file_name"] != 'desktop.ini':44 video_info_list.append({(elem["tracks"][0]["other_file_name"][0]+"."+elem["tracks"][0]["file_extension"]):\45 {"v_size": elem["tracks"][0]["file_size"], "v_duration": elem["tracks"][0]["duration"]}})46 else:47 print("找到了隐藏文件desktop.ini, 它没有'duration'这个键值对,需要跳过...")48 exceptKeyError:49 print("找到一个隐藏文件,该文件名为:", elem["tracks"][0]["file_name"])50 print(video_info_list)51 print(video_info_list[0].keys()) #dict_keys(['海阔天空.mp4'])

52 print(type(video_info_list[0].keys())) #

53

54 start_index =055 tomove_list =[]56 while start_index < (len(video_info_list)-1):57 find_index = start_index + 1

58 #print("start_index = ", start_index, "find_index = ", find_index)

59 #print(list(video_info_list[start_index].values()))

60 #print(list(video_info_list[start_index].values())[0]["v_size"])

61 #print(list(video_info_list[start_index].values())[0]["v_duration"])

62 sample0 = [list(video_info_list[start_index].values())[0]["v_size"], list(video_info_list[start_index].values())[0]["v_duration"]]63 while find_index

68 else:69 find_index += 1

70

71 #外层循环开始:

72 if tomove_list !=[]:73 tomove_list.reverse()74 print("to move list after reverse:", tomove_list)75 for tomove_item intomove_list:76 shutil.move(os.path.join(file_dir ,list(video_info_list[tomove_item].keys())[0]), dire_dir)77 video_info_list.pop(tomove_item) #非常重要,保证video_info_list与实际音频/视频数据一致

78 print("已经移除文件的编号为:", tomove_item)79 start_index += 1

80 tomove_list = []

完~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值