想知道自己的某个内存的小视频总时长?那这篇CSDN很适合你,快来看看Python如何实现求MP4时长吧(包含os模块和moviepy模块的全套基础操作)

今天我们就来看看哪个老司机的视频时长最长,嘿嘿嘿,废话不多说,任何内容都瞒不住咱的程序,包含os模块和moviepy模块的全套基础操作哦!我们直接开始!

一、我们需要的模块与包的使用

1、os模块

我们今天需要使用的模块有两个,一个是os模块,这是Python内置的与操作系统功能和文件系统相关的模块,那么我么看一看os模块的操作都有哪些吧!
有一些不好记的操作,我都把英文全名写了出来,懂英文应该就会好记很多。
在这里插入图片描述
至于具体的操作,我们就来看一看吧(就不演示了):
首先是获取当前工作路径os.getcwd(),这个直接调用就可以了。
之后是os.listdir(),这个的使用就是把路径放在括号里,返回一个列表(可以自己实操一下)
然后是os.walk(),我们今天就要使用这个函数,它也是把路径放在括号里,之后一层一层的遍历,返回一个元组。

  def get_all_file(self):
        for root, dirs, files in os.walk(file_dir):
            return files  # 当前路径下所有非目录子文件

比如上面就是我们代码的一部分,这里是元组拆包的使用,把元组里的路径,文件夹和文件赋给三个变量存储。

之后是os.mkdir(),这个路径可以任意写,执行之后系统会创建一个文件夹,路径同样是写在括号里。至于os.rmdir(),就不用多说了吧,把路径写在括号里,系统会移除文件夹。

os.path.isfile()os.path.isdir()也没什么好说的,把路径写在里面,就可以判断了。

但是拼接和切分的操作略有不同:
拼接(可以用于移动文件):os.path.join(),我们一看就知道需要写入两个路径,不然怎么拼接?所以写法就是os.path.join(path1,path2),含义就是把path2的路径追加到path1后面
切分:os.path.split(),切分只需要写入一个路径,含义是将路径path拆分成绝对路径文件名两部分。

当然了,os模块的使用还有很多,我们只介绍了我们经常用到的几种。

2、moviepy模块

MoviePy 是一个用于视频编辑的 python 模块,你可以用它实现一些基本的操作(比如视频剪辑,视频拼接,插入标题),还可以实现视频合成,还有视频处理,抑或用它加入一些自定义的高级的特效。
我们就看看moviepy有哪些功能我们经常使用:

在这里插入图片描述
视频读取clip = VideoFileClip("filename"),这个就不多说了。
视频剪辑clip2 =clip.subclip(3,10) 将视频的3-10秒的内容剪切出来 。
视频合并totalclip = concatenate_videoclips([clip1,clip2],method = 'compose') 将列表中的视频合并,可以包含多个,method不能少,避免格式错误。
改变分辨率clip.resize( newsize = (width,height) )
多图片转视频(可以用来做gif)clip = ImageSequenceclip ( [ jpg1,jpg2,jpg3 .... ] ,fps = 1) 这里的fps可以自己定
两个视频一个画面(也许是学习大师?)
CompositeVideoClip ([clip1.set_pos("left","center"),clip2.set_pos("right","center") ]size=(myclip2.w+myclip3.w, myclip2.h)

二、基础知识已经全部清楚,直接开整!

全部的代码如下:

import os
from moviepy.editor import VideoFileClip

file_dir = u"E:\Live Movie" #定义文件目录

class FileCheck():
    def __init__(self):
        self.file_dir = file_dir

    def get_file_times(self, filename):
        clip = VideoFileClip(filename)
        file_time = self.timeConvert(clip.duration)
        return file_time

    def timeConvert(self, size):  # 单位换算
        Minute, Hour = 60, 60 ** 2
        if size < Minute:
            return str(size) + u'秒'
        if size < Hour:
            return u'%s分钟%s秒' % (int(size / Minute), int(size % Minute))
        else:
            hour = int(size / Hour)
            mine = int(size % Hour / Minute)
            second = int(size % Hour % Minute)
            time = u'%s小时%s分钟%s秒' % (hour, mine, second)
            return time

    def get_all_file(self):
        for root, dirs, files in os.walk(file_dir):
            return files  # 当前路径下所有非目录子文件

fc = FileCheck()
files = fc.get_all_file()
for f in files:
    file_path = os.path.join(file_dir,f)
    file_times = fc.get_file_times(file_path)
    print(f"文件时长:{file_times}")

代码是不是很简单?但是效果很好!我相信只要认真看了上面的模块的教学,这部分代码一定没有太大问题。
我们现在就来看一看这些代码吧!
首先是获取文件路径,那我我们的os模块就可以发挥作用了。这里os模块主要在每一次获取了文件之后进行读取,以便下一个函数进行时间的计算(我们使用类来同时完成多个功能
读取了文件之后,计算时长需要书写函数:

    def timeConvert(self, size):  # 单位换算
        Minute, Hour = 60, 60 ** 2
        if size < Minute:
            return str(size) + u'秒'
        if size < Hour:
            return u'%s分钟%s秒' % (int(size / Minute), int(size % Minute))
        else:
            hour = int(size / Hour)
            mine = int(size % Hour / Minute)
            second = int(size % Hour % Minute)
            time = u'%s小时%s分钟%s秒' % (hour, mine, second)
            return time

这里是我们唯一的一个难点,就是单位换算,我们读取到的是秒,需要换算成小时和分钟,我们传入的size就是视频的duration。
为了正确的获取小时和分钟,我们还需要强制转换一下单位为整数,这点需要注意。

那么我们的难点也就解决了,现在就是定义一个对象读取文件,来实现操作了。

fc = FileCheck()
files = fc.get_all_file()
for f in files:
    file_path = os.path.join(file_dir,f)
    file_times = fc.get_file_times(file_path)
    print(f"文件时长:{file_times}")

FileCheck()就是我们书写的类,下面的get_all_file()则使用了os.walk(),也就是一个一个的遍历文件。
最后,我们调用get_file_times(),就能实现计算时长了。

这些就是我的小视频,嘿嘿:
在这里插入图片描述
好吧,我承认了,这些是纯英文字母电影,有需要的伙伴可以点击下面的链接获取:
链接:英文字幕电影
提取码:562n
–来自百度网盘超级会员V5的分享
伙计们,还不赶紧看看谁是真正的老司机吗?快用这些代码实际操作一下试一试吧!

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值