临近考研很多小伙伴都开始制定周密的计划,但是由于观看不同视频,播放的时长不同,计划也得随着改变,本程序可以获取不同文件夹下的不同视频的播放时长并生成.txt文件便于查看,同时会生成不同文件夹下视频格式下的总和。
1.加载视频,使用moviepy.editor库中的VideoFileClip类https://blog.csdn.net/Scarlett2025/article/details/117998921?spm=1001.2014.3001.5506
__init__(self, filename, has_mask=False,
audio=True, audio_buffersize=200000,
target_resolution=None, resize_algorithm='bicubic',
audio_fps=44100, audio_nbytes=2, verbose=False,
fps_source='tbr')
其中filename:视频文件名,只要是ffmpeg支持的视频文件如 .mp4, .mpeg, .avi, .mov等都可以
has_mask:如果视频文件中包含遮罩该参数设置为“True”
audio:如果视频没有声音或者希望加载时不读取音频,则应该将改参数设置为False
audio_buffersize:音频缓冲区大小,一般使用缺省值即可
target_resolution:设置为加载后需要变换到的分辨率,类型为列表或元组,第一个元素为分辨率的高,
第二个为宽,如果高或宽有一个为None,则保持现有纵横比调整帧的大小。
如果保持原分辨率不变,则不需要设置本参数或设置为None。如果设置了新的分辨率,
则在调用ffmpeg 返回视频剪辑的帧之前会按新的分辨率调整帧的大小。
这比使用转换为高分辨率流然后再调整分辨率会快很多resize_algorithm:要改变加载后的视频分辨率,可以通过resize_algorithm指定调整分辨率的算法,
缺省值为 “bicubic”,还可以是 “bilinear” 、"fast_bilinear"等。audio_fps:声音的采样频率
audio_nbytes:采样的位数
verbose:是否在标准输出设备上显示处理信息
fps_source:从视频的元数据metadata哪个数据中获取fps值,默认设置为’tbr’,但可以设置为’fps’,
这可能有助于导入慢动作视频,否则会弄糟。
2.引入os库对文件操作
例:os.listdir(path)
对path文件夹下进行索引,返回列表值
代码
from moviepy.editor import VideoFileClip
import os
# Communication class 2
# zx
# 19020810212
try:
Time = 0 #时
minute = 0#分
second = 0#秒
all_Time = 0
all_minute = 0
all_second = 0
all_f = 0 #文件数
#all_second_f = 0 #临时变量
print("!!!!----本程序为,索引文件夹中的音频播放时间并生成.txt文件----!!!!\n")
print("!!!!----生成 .txt文件中有音频的根地址和播放时长小时分钟秒----!!!!\n")
print("!!!!-----------------音频格式为 .mp4.avi.flv-----------------!!!!\n")
address = input("请输入音频格式下的地址(可以是文件但是只能最多包含2层文件夹)\n例: ...\文件下的\文件中的\\.mp4 \n")
f_address = input("\n请输入需要保存到的.txt文件的根目录,例E:\\py\\f.txt\n")
f = open(f_address,"a")
#直接输入视频格式
if (os.path.isdir(address) == False ) and (address[-3:] in ['mp4','avi','flv']):
clip = VideoFileClip(address)
print( clip.duration ) # seconds
Time = int(clip.duration/3600)
minute = int((clip.duration - Time*3600)/60)
second = int(((clip.duration - Time*3600)-minute*60))
print(address + " " + str(Time) + ':' + str(minute) + ':'+ str(second))
f.write(address + " " + str(Time) + ':' + str(minute) + ':'+ str(second))
f.write('\n')
all_f += 1
all_second += clip.duration
#输入上一层文件
elif (os.path.isdir(address) == True ):#如果是个文件
dataname = os.listdir(address) #读取文件夹里的文件
for i_address in dataname:
i_address_1 = address + '\\' + i_address
all_f_f = 0
all_Time_f = 0
all_minute_f = 0
all_second_f = 0
#文件里里的是视频
if (os.path.isdir(i_address_1) == False ) and (i_address[-3:] in ['mp4','avi','flv']):#不是文件且后缀为音频
clip = VideoFileClip(i_address_1)
print( clip.duration ) # seconds
Time = int(clip.duration/3600)
minute = int((clip.duration - Time*3600)/60)
second = int(((clip.duration - Time*3600)-minute*60))
print(i_address_1 + " " + str(Time) + ':' + str(minute) + ':'+ str(second))
f.write(i_address_1 + " " + str(Time) + ':' + str(minute) + ':'+ str(second))
f.write('\n')
all_f += 1
all_second += clip.duration
#文件夹里是个文件夹
elif (os.path.isdir(i_address_1) == True ):#是文件
dataname_1 = os.listdir(i_address_1) #读取文件夹里的文件
for ii_address in dataname_1:
i_address_2 = i_address_1 + '\\' + ii_address
#是视频
if (os.path.isdir(i_address_2) == False ) and (ii_address[-3:] in ['mp4','avi','flv']):#不是文件且后缀为音频
clip = VideoFileClip(i_address_2)
print( clip.duration ) # seconds
Time = int(clip.duration/3600)
minute = int((clip.duration - Time*3600)/60)
second = int(((clip.duration - Time*3600)-minute*60))
print(i_address_2 + " " + str(Time) + ':' + str(minute) + ':'+ str(second))
f.write(i_address_2 + " " + str(Time) + ':' + str(minute) + ':'+ str(second))
f.write('\n')
all_f += 1
all_f_f += 1
all_second += clip.duration
all_second_f += clip.duration
all_Time_f = int(all_second_f/3600)
all_minute_f = int((all_second_f - all_Time_f*3600)/60)
all_second_f = int(((all_second_f - all_Time_f*3600)-all_minute_f*60))
f.write('\n')
print(i_address_1 + "\n 总共" + str(all_f_f) +"个文件 共" + str(all_Time_f)+"小时 " + str(all_minute_f) + "分钟 " + str(all_second_f) + "秒")
f.write(i_address_1 + "\n 总共" + str(all_f_f) +"个文件 共" + str(all_Time_f)+"小时 " + str(all_minute_f) + "分钟 " + str(all_second_f) + "秒")
f.write("\n\n")
all_Time = int(all_second/3600)
all_minute = int((all_second - all_Time*3600)/60)
all_second = int(((all_second - all_Time*3600)-all_minute*60))
print(" 总共" + str(all_f) +"文件 共" + str(all_Time)+"小时 " + str(all_minute) + "分钟 " + str(all_second) + "秒")
f.write(" 总共" + str(all_f) +"文件 共" + str(all_Time)+"小时 " + str(all_minute) + "分钟 " + str(all_second) + "秒")
f.close()
except:
print("Failde Somehow")
pycharm运行结果如下
.txt文件如下