社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

用 Python 和 EV 剪辑短视频

Python中文社区 • 3 年前 • 549 次点击  


现在小视频非常流行,如何进行高效简便的视频剪辑,是各个up主的必备技能。本文借助python和EV剪辑制作我们所要的视频效果,不仅免费,而且没有广告水印。

一、将图片转化成视频

通过python的opencv库就可以把图片转成视频,要注意的是把帧率设置成30,方便后续和其他视频拼接,因为帧率不同会导致拼接出错。

import cv2,osimport matplotlib.pyplot as pltfrom PIL import Imagecanshu=0.5  #设置视频分辨率参数img = Image.open('中国票据发展报告.jpg')img.save('ddd.jpg')img = cv2.imread('ddd.jpg') #设置一个图片的大小作为指定大小imgInfo = img.shapesize = (int(imgInfo[1]*canshu


    
),int(imgInfo[0]*canshu))fourcc = cv2.VideoWriter_fourcc('M','J','P','G') videoWrite = cv2.VideoWriter('3.avi',fourcc,30,size,True)  #参数依次是:文件路径;指定编码器;帧率;画面大小;是彩色还是黑色file_list = os.listdir('./1//')   #获取文件夹里的列表for i in range(0,len(file_list)):    fileName ='./1//'+file_list[i]    img = Image.open(fileName)    #根据样本图片调整图片大小    (x00,y00) =


    
 img.size    x_s = x00*canshu    y_s = int(y00 * x_s / x00)     img = img.resize(size,Image.ANTIALIAS)    img.save('ddd.jpg')    img = cv2.imread('ddd.jpg') #读取图像    #因为是单张图片的时间太短,每一张图片插入20帧    for j in range(0,20):        videoWrite.write(img)videoWrite.release()

但是如果要将图片做一些简单的动画效果,例如做一个画面逐渐缩小的动画,那就要借助EV剪辑,调整图片的大小,加上白背景,然后导出视频。


注意导出的时候要设置帧率,如果时间过长,可以设置设置帧率低一点,然后用python程序把播放速度提升,帧率也会相应提高。

import cv2vdop = "4.mp4"#输入视频路径cap = cv2.VideoCapture(vdop) fps = cap.get(cv2.CAP_PROP_FPS) #获取输入视频的帧率size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)),        int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))#获取输入视频的大小fourcc = cv2.VideoWriter_fourcc('I', '4', '2', '0')  #These are the FOURCCs to compressed formatsout_path = "8.mp4" #输出2倍速的avi格式的视频路径


    
output_viedo = cv2.VideoWriter()fps = (29.5/26.8)*fps #2倍速处理#isColor:如果该位值为Ture,解码器会进行颜色框架的解码,否则会使用灰度进行颜色架构output_viedo.open(out_path , fourcc, fps, size, isColor=True)rval = Truewhile rval:    rval, img = cap.read()#逐帧读取原视频    output_viedo.write(img)#写入视频帧output_viedo.release()cap.release()

用opencv处理过的视频会失去音频。我们也可以使用ffmpeg来调速,可以保留声音,特别适合微调。要使用FFmpeg,安装完之后,设置环境变量,就能在python调用FFmpeg。

import osos.system('ffmpeg -i 4.mp4 -vf  "setpts=2*PTS" 8.mp4')  #图像两倍慢速

二、将视频添加音频作为背景音乐

import subprocess,osmp4_f = './2.avi'mp3_f = './背景音.mp3'n_mp4_n = 'new' + mp4_f.split('/')[-1]n_mp4_f = mp4_f.replace(mp4_f.split('/')[-1],n_mp4_n)com = f'D:\\ffmpeg\\bin\\ffmpeg.exe -i "{mp3_f}" -i "{mp4_f}" ' \ f' -acodec copy -vcodec copy "{n_mp4_f}"'print(com)os.system(com)

三、合并视频

1.剪切视频

import os


    
import subprocess,cv2com = f'ffmpeg -i 5.mp4 -c copy -t 00:00:20.0 output.mp4'  # 截取前20秒  -ss 00:00:00.0   起始位置os.system(com)

2.要将不同的视频合并,首先要确保帧率和画布大小一样,这样才能确保合并起来不出错。下面代码是调整画布。将形状不同的视频画面,要按照原视频的比例,调整到一个框里面去。

import subprocess,osimport cv2#获取样本的画布大小video_path = "2\\1.mp4"cap = cv2.VideoCapture(video_path)frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))# 获取视频高度frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))# 获取视频宽度fps = cap.get(cv2.CAP_PROP_FPS


    
) #视频平均帧率h0=frame_heightw0=frame_widthfile_list = os.listdir('3\\')   #获取文件夹里的所有文件列表for i in file_list:  #获取当前视频的  video_path = '3\\'+i  cap = cv2.VideoCapture(video_path)  frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))  # 获取视频高度、宽度  frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))  h=frame_height  w=frame_width


    
    if h/w>h0/w0:      strn=f'ffmpeg -i %s -vf "scale=(%s*%s/%s):%s,pad=%s:%s:(%s-(%s*%s/%s))/2:0:black" %s'%  (video_path,w,h0,h,h0,        w0,h0,w0,w,h0,h,i)  else:                     strn=f'ffmpeg -i  %s -vf "scale=%s:%s*%s/%s,pad=%s:%s:0:((%s-(%s*%s/%s))/2):black"  %s'%    (video_path,w0,w0,h,w,       w0,h0,          h0,w0,h,w,i)                              #本图缩放后=宽:高,位置=总宽:总高:水平方向放置的位置:垂直方向放置的位置  os.system(strn)

3.将视频合并

将视频先转化成ts格式,然后再合并,成功率更高。

import oslista='kaishiwizhi'#先获取这些MP4文件,转换成ts格式for each in os.listdir():    if each[-3:] in ['mp4','avi'] :        os.system('ffmpeg.exe -i %s -c copy -vbsf h264_mp4toannexb %s.ts' % (each, each[:-4]))        lista=lista +('|%s.ts'%(each[:-4]))lista=lista.replace('kaishiwizhi|','')import subprocess,cv2#subprocess.call(cmd, shell=True)com = f'ffmpeg -i "concat:%s" -c copy 333333.avi'%


    
lista#com = f'mencoder -forceidx -of lavf -oac copy -ovc copy -o output.avinew 2.avi new 2.avi'print(com)os.system(com)


作者简介:霍青,一个用python的up主


赞 赏 作 者


点击下方阅读原文加入 社区会员

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/117257
 
549 次点击