[原创]使⽤python对视频⾳频⽂件进⾏详细信息采集,并进⾏去重
操作
[原创]使⽤python对视频/⾳频⽂件进⾏详细信息采集,并进⾏去重操作
转载请注明出处
⼀.关于为什么⽤pymediainfo以及pymediainfo的安装
  使⽤python对视频/⾳频⽂件进⾏详细信息采集,并进⾏去重操作的核⼼是使⽤pymediainfo这个库
  之前本⼈⼀直在试着⽤moviepy库中的VideoFileClip来获取视频/⾳频⽂件的详细信息,但效果不理想,⼀直报错根本⽆法解决.
  直到本⼈发现了pymediainfo这个库,问题才得到解决(pymediainfo可以获取极其详细的⾳频/视频⽂件的具体信息).
    1.pip install pymediainfo  或者 python -m pip install pymediainfo
    3.特别重要的⼀步:到你安装pymediainfo的⽂件夹中到MediaInfo.dll这个⽂件,把它复制到你Pytho
n的根⽬录下(不复制程序会报⽆法打开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分钟)
1import os
2import shutil
3
4from pymediainfo import MediaInfo
5
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
14def get_all_file(f_dir): # 获取⽂件名称与⽂件⼤⼩,以⽅便使⽤MediaInfo库遍历获取视频/⾳频⽂件的超详细信息
15for root, dirs, files in os.walk(f_dir, topdown=True): # root就是"D:\Movie\180919", dirs 为[], files为全部⽂件列表
16for name in files:
17            video_sumlist.append(os.path.join(root, name))
18
19 get_all_file(file_dir)
20# print(video_sumlist)
学python看谁的视频比较好21
22for i in video_sumlist: # 获取视频/⾳频⽂件的详细信息并存储到video_detail_list中
23    media_info = MediaInfo.parse(i)
24    data = _data()
25    video_detail_list.append(data)
26    count+=1
27print("执⾏完第%d条数据...,视频名称为:%s"%(count, data["tracks"][0]["other_file_name"]))
28
29
30 with open(r"./video_detail.py", "w", encoding='utf-8') as f: # 因为遍历上万⽂件太费时,需要将视频/⾳频信息存储在⽂件中,以减少程序执⾏时间
31print("开始执⾏写⼊操作...")
32    f.write(str(video_detail_list))
33
34 with open(r"./video_detail.py", "r", encoding='utf-8') as f: # 将存储在file⽂件中的信息读取到vfile中
35print("开始执⾏读取操作...")
36    vfile = ad())
37print(type(vfile))
38
39for 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"])
42try:
43if 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"]}})
46else:
47print("到了隐藏⽂件desktop.ini, 它没有'duration'这个键值对,需要跳过...")
48except KeyError:
49print("到⼀个隐藏⽂件,该⽂件名为: ", elem["tracks"][0]["file_name"])
50print(video_info_list)
51print(video_info_list[0].keys())      # dict_keys(['海阔天空.mp4'])
52print(type(video_info_list[0].keys())) # <class 'dict_keys'>
53
54 start_index = 0
55 tomove_list = []
56while 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"]]
63while find_index < len(video_info_list):
64if sample0[0] == list(video_info_list[find_index].values())[0]["v_size"] and \
65        sample0[1] == list(video_info_list[find_index].values())[0]["v_duration"]:
66            tomove_list.append(find_index)
67            find_index += 1
68else:
69            find_index += 1
70
71# 外层循环开始:
72if tomove_list != []:
73        verse()
74print("to move list after reverse: ", tomove_list)
75for tomove_item in tomove_list:
76            ve(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与实际⾳频/视频数据⼀致
78print("已经移除⽂件的编号为: ", tomove_item)
79    start_index += 1
80    tomove_list = []
完~

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。