1. 程式人生 > >[原創]使用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 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 = []

完~