現(xiàn)在小視頻非常流行,如何進(jìn)行高效簡(jiǎn)便的視頻剪輯,是各個(gè)up主的必備技能。本文借助python和EV剪輯制作我們所要的視頻效果,不僅免費(fèi),而且沒(méi)有廣告水印。
一、將圖片轉(zhuǎn)化成視頻
通過(guò)python的opencv庫(kù)就可以把圖片轉(zhuǎn)成視頻,要注意的是把幀率設(shè)置成30,方便后續(xù)和其他視頻拼接,因?yàn)閹什煌瑫?huì)導(dǎo)致拼接出錯(cuò)。
importcv2,os importmatplotlib.pyplotasplt fromPILimportImage canshu=0.5 #設(shè)置視頻分辨率參數(shù) img=Image.open('圖一.jpg') img.save('ddd.jpg') img=cv2.imread('ddd.jpg')#設(shè)置一個(gè)圖片的大小作為指定大小 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) #參數(shù)依次是:文件路徑;指定編碼器;幀率;畫面大??;是彩色還是黑色 file_list=os.listdir('./1//') #獲取文件夾里的列表 foriinrange(0,len(file_list)): fileName='./1//'+file_list[i] img=Image.open(fileName) #根據(jù)樣本圖片調(diào)整圖片大小 (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')#讀取圖像 #因?yàn)槭菃螐垐D片的時(shí)間太短,每一張圖片插入20幀 forjinrange(0,20): videoWrite.write(img) videoWrite.release()但是如果要將圖片做一些簡(jiǎn)單的動(dòng)畫效果,例如做一個(gè)畫面逐漸縮小的動(dòng)畫,那就要借助EV剪輯,調(diào)整圖片的大小,加上白背景,然后導(dǎo)出視頻。
注意導(dǎo)出的時(shí)候要設(shè)置幀率,如果時(shí)間過(guò)長(zhǎng),可以設(shè)置設(shè)置幀率低一點(diǎn),然后用python程序把播放速度提升,幀率也會(huì)相應(yīng)提高。
importcv2 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') #ThesearetheFOURCCstocompressedformats out_path="8.mp4"#輸出2倍速的avi格式的視頻路徑 output_viedo=cv2.VideoWriter() fps=(29.5/26.8)*fps#2倍速處理 #isColor:如果該位值為Ture,解碼器會(huì)進(jìn)行顏色框架的解碼,否則會(huì)使用灰度進(jìn)行顏色架構(gòu) output_viedo.open(out_path,fourcc,fps,size,isColor=True) rval=True whilerval: rval,img=cap.read()#逐幀讀取原視頻 output_viedo.write(img)#寫入視頻幀 output_viedo.release() cap.release()用opencv處理過(guò)的視頻會(huì)失去音頻。我們也可以使用ffmpeg來(lái)調(diào)速,可以保留聲音,特別適合微調(diào)。要使用FFmpeg,安裝完之后,設(shè)置環(huán)境變量,就能在python調(diào)用FFmpeg。
importos os.system('ffmpeg-i4.mp4-vf "setpts=2*PTS"8.mp4') #圖像兩倍慢速二、將視頻添加音頻作為背景音樂(lè)
importsubprocess,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:fmpeginfmpeg.exe-i"{mp3_f}"-i"{mp4_f}"' f'-acodeccopy-vcodeccopy"{n_mp4_f}"' print(com) os.system(com)三、合并視頻
1.剪切視頻
importos importsubprocess,cv2 com=f'ffmpeg-i5.mp4-ccopy-t00:00:20.0output.mp4' #截取前20秒 -ss00:00:00.0 起始位置 os.system(com)2.要將不同的視頻合并,首先要確保幀率和畫布大小一樣,這樣才能確保合并起來(lái)不出錯(cuò)。下面代碼是調(diào)整畫布。將形狀不同的視頻畫面,要按照原視頻的比例,調(diào)整到一個(gè)框里面去。
importsubprocess,os importcv2 #獲取樣本的畫布大小 video_path="2.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') #獲取文件夾里的所有文件列表 foriinfile_list: #獲取當(dāng)前視頻的 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 ifh/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.將視頻合并
將視頻先轉(zhuǎn)化成ts格式,然后再合并,成功率更高。
importos lista='kaishiwizhi' #先獲取這些MP4文件,轉(zhuǎn)換成ts格式 foreachinos.listdir(): ifeach[-3:]in['mp4','avi']: os.system('ffmpeg.exe-i%s-ccopy-vbsfh264_mp4toannexb%s.ts'%(each,each[:-4])) listalista=lista+('|%s.ts'%(each[:-4])) listalista=lista.replace('kaishiwizhi|','') importsubprocess,cv2 #subprocess.call(cmd,以上內(nèi)容為大家介紹了用python和EV剪輯短視頻,希望對(duì)大家有所幫助,如果想要了解更多Python相關(guān)知識(shí),請(qǐng)關(guān)注IT培訓(xùn)機(jī)構(gòu):千鋒教育。http://m.2667701.com/