[原創]使用python對視頻/音頻文件進行詳細信息採集,併進行去重操作 轉載請註明出處 一.關於為什麼用pymediainfo以及pymediainfo的安裝 使用python對視頻/音頻文件進行詳細信息採集,併進行去重操作的核心是使用pymediainfo這個庫 之前本人一直在試著用moviep ...
[原創]使用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 import os 2 import shutil 3 4 from 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 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 in files: 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 except KeyError: 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())) # <class 'dict_keys'> 53 54 start_index = 0 55 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 < len(video_info_list): 64 if 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 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 in tomove_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 = []
完~