python统计一个文件夹里所有视频总时长(单线程 带进度条、多线程)

简介

  • 需要第三方库moviepy,可以自己pip安装,就不阐述了
  • 可以统计该文件夹下所有文件夹里的视频
  • 单线程带进度条,多线程只能是每个进程的进度条

  1. 本来以为每多一个线程,速度会提升,实际做了之后,发现速度并没有提升多少,线程多了之后(大于3个),反而会崩溃。

  2. 观察总结后,猜想应该是moviepy库太占内存,一个线程就70%的内存占用了,两个线程之后,就100%,速度自然提升不上去

  3. 而且磁盘读取速度是100%,看来主要受到磁盘读取速度限制。

  4. 而且多线程后,无法提供进度条,这个就很没有体验感了

但是也贴出代码,当做一个记录


单线程带总进度条

import os
import datetime
from moviepy.editor import VideoFileClip
import time

def compute_video_time(path):
    type = ('.flv','.mp4','.ts','.AVI','.avi','.rm','3GP','.rmvb','.asf','.mpg','.wmv','mkv','.vob')
    filelist = []
        
    for a, b, c in os.walk(path):
        for name in c:
            fname = os.path.join(a, name)
            if fname.endswith(type):
                filelist.append(fname)
    print("------开始计算时间------")
    ftime = 0.0
    count = 0
    for item in filelist:
        try:
            clip = VideoFileClip(item)
            ftime += clip.duration
            count = count + 1
            print("已完成%.2f" %((count / filelist.__len__()) * 100)+"%" )
            clip.reader.close()		# 防止出现错误:句柄无效
            clip.audio.reader.close_proc()
        except:
            print(item)
    print("总共%d个文件" %count)
    print("%d seconds: " % ftime,str(datetime.timedelta(seconds=ftime)))


if __name__ == "__main__":
    time1 = time.time()
    
    path = r"F:\XXX\XXX\XXX"
    compute_video_time(path)
    
    time2 = time.time()
    print(time2 - time1)
    

多线程(每个线程有进度条)


import os
import datetime
from moviepy.editor import VideoFileClip
import threading
from openpyxl.chart.trendline import Trendline
from asyncio.tasks import sleep
import time

def compute_video_time(path):
    type = ('.flv','.mp4','.ts','.AVI','.avi','.rm','3GP','.rmvb','.asf','.mpg','.wmv','mkv','.vob')
    filelist = []
 
    for a, b, c in os.walk(path):
        for name in c:
            fname = os.path.join(a, name)
            if fname.endswith(type):
                filelist.append(fname)
     
    end_list = split_list(filelist)
     
    thread_list = []
     
    for i in range(len(end_list)):
#     for i in range(8):
        t1 = threading.Thread(target=compute,args=((end_list[i]), i))
        thread_list.append(t1)
         
         
    for i in range(len(thread_list)):
        thread_list[i].start()
        
    for t in thread_list:
        t.join()
        
    print("程序结束")
    print("%d seconds: " % all_time,str(datetime.timedelta(seconds=all_time)))
       
def split_list(all_list):
    
    end_list = []
    n = len(all_list) // 3   #这里把一个列表切分成3个列表,在这里控制进程数
    for i in range(0, len(all_list), n):
        name=all_list[i:i + n]
        end_list.append(name)
        
    return end_list
     
 
 
 
def compute(filelist, i):    
    print("------开始计算时间------")
    ftime = 0.0
    count = 0
    for item in filelist:
        clip = VideoFileClip(item)
        ftime += clip.duration
        count = count + 1
        print("线程%d"%i+"已完成%.2f" %((count / filelist.__len__()) * 100)+"%" )
        clip.reader.close()	# 防止出现错误:句柄无效
        clip.audio.reader.close_proc()
    mutex.acquire()
    global all_time
    all_time += ftime
    mutex.release()
 
 
 
if __name__ == "__main__":
    time1 = time.time()
    
    
    all_time = 0.0 
    mutex = threading.Lock()
    path = r"F:\XXX"
    compute_video_time(path)
    
    time2 = time.time()
    print(time2 - time1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值