共计 3598 个字符,预计需要花费 9 分钟才能阅读完成。
导读 | 现在小视频非常流行,如何进行高效简便的视频剪辑,是各个 up 主的必备技能。本文借助 python 和 EV 剪辑制作我们所要的视频效果,不仅免费,而且没有广告水印。 |
一、将图片转化成视频
通过 python 的 opencv 库就可以把图片转成视频,要注意的是把帧率设置成 30,方便后续和其他视频拼接,因为帧率不同会导致拼接出错。
import cv2,os | |
import matplotlib.pyplot as plt | |
from PIL import Image | |
canshu=0.5 #设置视频分辨率参数 | |
img = Image.open('中国票据发展报告.jpg') | |
img.save('ddd.jpg') | |
img = cv2.imread('ddd.jpg') #设置一个图片的大小作为指定大小 | |
imgimgInfo = img.shape | |
size = (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) | |
imgimg = 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 cv2 | |
vdop = "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 formats | |
out_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 = True | |
while rval: | |
rval, img = cap.read()# 逐帧读取原视频 | |
output_viedo.write(img)# 写入视频帧 | |
output_viedo.release() | |
cap.release() |
用 opencv 处理过的视频会失去音频。我们也可以使用 ffmpeg 来调速,可以保留声音,特别适合微调。要使用 FFmpeg,安装完之后,设置环境变量,就能在 python 调用 FFmpeg。
import os | |
os.system('ffmpeg -i 4.mp4 -vf"setpts=2*PTS"8.mp4') #图像两倍慢速 |
二、将视频添加音频作为背景音乐
import subprocess,os | |
mp4_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,cv2 | |
com = 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,os | |
import 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_height | |
w0=frame_width | |
file_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 os | |
lista='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])) | |
listalista=lista +('|%s.ts'%(each[:-4])) | |
listalista=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) |
正文完
星哥玩云-微信公众号
