今天我们就来看看哪个老司机的视频时长最长,嘿嘿嘿,废话不多说,任何内容都瞒不住咱的程序,包含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的分享
伙计们,还不赶紧看看谁是真正的老司机吗?快用这些代码实际操作一下试一试吧!