zoukankan      html  css  js  c++  java
  • [原创]使用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:Movie180919"  
        dire_dir = r'D:MovieBBB'

       更改成你自己的绝对路径就可以了(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:Movie180919"                # 定义文件目录(需要自己添加文件的绝对路径)
     8 dire_dir = r'D:MovieBBB'                    # 目标路径,将可能重复的文件移动至此(需要自己添加文件的绝对路径)
     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:Movie180919", 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 = []

    完~

  • 相关阅读:
    linux驱动程序设计的硬件基础,王明学learn
    linux设备驱动概述,王明学learn
    应用程序调试工具gdb,王明学learn
    usb设备驱动描述,王明学learn
    OK6410移植madplay播放器,王明学learn
    bootstrap使用入门(bootstrap4.2.1版本)
    IntelliJ Idea 常用快捷键列表
    javaFX 多窗口编程
    Spring Boot框架入门教程(快速学习版)
    BindingNavigator 控件
  • 原文地址:https://www.cnblogs.com/fengbo1113/p/10225920.html
Copyright © 2011-2022 走看看