作者 by Doubt-Fact /
作为影视学习的必修课,疯狂拉片是每个传媒人必须经历的过程。但在拉片的过程中,表格内容多,重复性、机械性劳动量大,尤其是截图和镜头时长的统计工作,往往需要我们将播放头在一个镜头的前后拖动多次,很消耗时间,对影片的分析也没有起到实质性的帮助。
怎么快速、简易的完成截图和时长统计工作呢?这里给出一种方法。
Python、FFmpeg
(Python中需安装CV2和ffmpeg库,推荐使用pip安装)
首先对视频分段(两种方案,一是自动分析,参考https://mp.weixin.qq.com/s/U818hQo2RGk62u1AMsf0oA;二是手动分段后批量导出。这里推荐第二种,毕竟AI并不是完全准确的,而且分析镜头肯定要把镜头划分出来吧,哈哈);接着使用OpenCV或ffmpeg进行时长分析(前者比后者快,但是配置可能稍微复杂一点),将时长输出为表格;随后,再使用ffmpeg截取每段视频的第一帧(网上用第一秒的多,但当面对《罗拉快跑》这种片子时……)
直接看代码吧,地址修改成自己的就ok
import os,time
import cv2
import ffmpy
#获取文件夹中的文件名列表
def get_file_list(file_path):
dir_list = os.listdir(file_path)
if not dir_list:
return
else:
# 注意,这里使用lambda表达式,将文件按照最后修改时间顺序升序排列
# os.path.getmtime() 函数是获取文件最后修改时间
# os.path.getctime() 函数是获取文件最后创建时间
dir_list = sorted(dir_list,key=lambda x: os.path.getmtime(os.path.join(file_path, x)))
# print(dir_list)
return dir_list
# 每个镜头的地址
file_path = 'E:/DaVinciobject/114514/'
dir_list = get_file_list(file_path)
#读取时长
def get_vedio_height_width(filename):
cap = cv2.VideoCapture(filename)
time = str(cap.get(cv2.CAP_PROP_FRAME_COUNT))
return time
# print(listdir)
list=[]
def main():
for dir in dir_list:
time = get_vedio_height_width(file_path+dir)
a=time
line=a
list.append(line)
b=str(list)
print(b)
# 将数据写入临时文件
with open("2233.txt","w") as f:
f.write(b)
s=[]
# 将数据分行
f = open('H:\\test\\2233\\2233.txt','r', encoding='utf-8')
for lines in f:
ls = lines.strip('\n').replace(' ','').replace('《','/').replace('?','').split(',')
for i in ls:
s.append(i)
f.close()
# 将数据写入csv文件
f1 = open('2233.csv','w',encoding='utf-8')
for j in s:
f1.write(j+'\n')
f1.close()
# 删除临时文件
os.remove("./2233.txt")
Shu_Zu_Shu=len(list)
# print(Shu_Zu_Shu)
i=1
print(Shu_Zu_Shu)
#截取第1帧
for dir in dir_list:
ff = ffmpy.FFmpeg(
inputs={file_path+dir: None},
# outputs={mingming+'.mp4': None}
outputs={file_path+dir+'.jpg': '-ss 0 -frames:v 1'}
)
ff.run()
main()
我们取一批视频,按照一定的命名方式命名
我们运行程序
(运行过程不展示了,但必须要说,跑循环截图的时候控制台一串串信息往下跑是真的帅)
可以看到在视频的同文件夹出现了jpg格式的截图
而程序同文件夹下则出现了一个csv格式的文件,打开文件,表格中的数字就是每一个镜头的时长了(单位秒
)
('
可以在文件中按ctrl+f
批量去掉)
感谢阅读~
评论已关闭