现在小视频很流行。如何高效、轻松地剪辑视频,是每一位up主的必备技能。本文使用python和EV剪辑制作出我们想要的视频效果,不仅免费,而且无广告水印。1.将图片转成视频可以通过python的opencv库将图片转成视频。需要注意的是,帧率设置为30,方便后续与其他视频拼接,因为不同的帧率会导致拼接错误。importcv2,osimportmatplotlib.pyplotaspltfromPILimportImagecanshu=0.5#设置视频分辨率参数img=Image.open('中国账单发展报告.jpg')img.save('ddd.jpg')img=cv2.imread('ddd.jpg')#设置图片大小为指定大小imgimgInfo=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)#参数为:文件路径;指定编码器;帧率;屏幕尺寸;colororblackfile_list=os.listdir('./1//')#获取文件夹中的列表foriinrange(0,len(file_list)):fileName='./1//'+file_list[i]img=Image.open(fileName)#根据示例图片调整图片大小(x00,y00)=img.sizex_s=x00*canshuy_s=int(y00*x_s/x00)imgimg=img.resize(size,Image.ANTIALIAS)img.save('ddd.jpg')img=cv2.imread('ddd.jpg')#读取图片#因为单张图片时间太短,每张图片插入20帧forjinrange(0,20):videoWrite.write(img)videoWrite.release()但是如果想对图片做一些简单的动画效果,比如图片逐渐缩小的动画,就需要使用EV剪辑来调整图片的大小,添加一个白色背景,然后导出视频。注意导出时需要设置帧率。如果时间过长,可以将帧率设置低一些,然后使用python程序提高播放速度,帧率会相应提高。importcv2vdop="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')#ThesearetheFOURCCstocompressedformatsout_path="8.mp4"#以avi格式输出2倍速视频路径output_viedo=cv2.VideoWriter()fps=(29.5/26.8)*fps#2xspeedprocessing#isColor:如果该位的值为True,解码器将解码颜色frame,否则会使用灰度进行色彩架构output_viedo.open(out_path,fourcc,fps,size,isColor=True)rval=Truewhileval:rval,img=cap.read()#逐帧读取原始视频write(img)#写入视频帧output_viedo.release()cap.release()opencv处理后的视频会丢失音频。我们也可以使用ffmpeg来调速,这样可以保留声音,特别适合做微调。使用FFmpeg,安装后设置环境变量,即可在python中调用FFmpeg。importosos.system('ffmpeg-i4.mp4-vf"setpts=2*PTS"8.mp4')#图像慢了一倍2.给视频添加音频作为背景音乐importsubprocess,osmp4_f='./2.avi'mp3_f='./backgroundsound.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'-acodeccopy-vcodeccopy"{n_mp4_f}"'print(com)操作系统。system(com)3.合并视频1.剪切视频importosimportsubprocess,cv2com=f'ffmpeg-i5.mp4-ccopy-t00:00:20.0output.mp4'#截取前20秒-ss00:00:00.0起始位置os.system(com)2.合并不同的视频,首先要保证帧率和画布大小一致,这样才能保证合并不出错。下面的代码是调整画布。不同形状的视频图像要根据原始视频的比例调整成一帧。importsubprocess,osimportcv2#获取样本画布大小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\\')#获取所有文件在thefolderListforiinfile_list:#获取当前视频的video_path='3\\'+icap=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_heightw=frame_widthifh/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)#此图缩放=宽:高,位置=总宽:总高t:positionplacedinthehorizo??ntaldirection:positionplacedintheverticaldirectionos.system(strn)3.合并视频先将视频转成ts格式,再合并,成功率更高。importoslista='kaishiwizhi'#先获取这些MP4文件,将其转化为ts格式foreachinos.listdir():ifeach[-3:]in['mp4','avi']:os.system('ffmpeg.exe-i%s-ccopy-vb??sfh264_mp4toannexb%s.ts'%(each,each[:-4]))listalista=lista+('|%s.ts'%(each[:-4]))listalista=lista.replace('kaishiwizhi|','')importsubprocess,cv2#subprocess.call(cmd,shell=True)com=f'ffmpeg-i"concat:%s"-ccopy333333.avi'%lista#com=f'mencoder-forceidx-oflavf-oaccopy-ovccopy-ooutput.avinew2.avinew2.avi'print(com)os.system(com)
