一种半自动拉片机的实现方法实践

作者 by Doubt-Fact /

半自动拉片机

前言

作为影视学习的必修课,疯狂拉片是每个传媒人必须经历的过程。但在拉片的过程中,表格内容多,重复性、机械性劳动量大,尤其是截图和镜头时长的统计工作,往往需要我们将播放头在一个镜头的前后拖动多次,很消耗时间,对影片的分析也没有起到实质性的帮助。

怎么快速、简易的完成截图和时长统计工作呢?这里给出一种方法。


所需工具

PythonFFmpeg

(Python中需安装CV2和ffmpeg库,推荐使用pip安装)


思路

首先对视频分段(两种方案,一是自动分析,参考https://mp.weixin.qq.com/s/U818hQo2RGk62u1AMsf0oA;二是手动分段后批量导出。这里推荐第二种,毕竟AI并不是完全准确的,而且分析镜头肯定要把镜头划分出来吧,哈哈);接着使用OpenCVffmpeg进行时长分析(前者比后者快,但是配置可能稍微复杂一点),将时长输出为表格;随后,再使用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格式的截图

uTools_1667482416289.png

而程序同文件夹下则出现了一个csv格式的文件,打开文件,表格中的数字就是每一个镜头的时长了(单位
'可以在文件中按ctrl+f批量去掉)

uTools_1667482578961.png

感谢阅读~

评论已关闭