如何用 Python 和 EV 剪輯短視頻
現(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ò)。
- import cv2,os
- import matplotlib.pyplot as plt
- from PIL import Image
- canshu=0.5 #設(shè)置視頻分辨率參數(shù)
- img = Image.open('中國(guó)票據(jù)發(fā)展報(bào)告.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ù)依次是:文件路徑;指定編碼器;幀率;畫(huà)面大??;是彩色還是黑色
- file_list = os.listdir('./1//') #獲取文件夾里的列表
- for i in range(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幀
- for j in range(0,20):
- videoWrite.write(img)
- videoWrite.release()
但是如果要將圖片做一些簡(jiǎn)單的動(dòng)畫(huà)效果,例如做一個(gè)畫(huà)面逐漸縮小的動(dòng)畫(huà),那就要借助EV剪輯,調(diào)整圖片的大小,加上白背景,然后導(dǎo)出視頻。
注意導(dǎo)出的時(shí)候要設(shè)置幀率,如果時(shí)間過(guò)長(zhǎng),可以設(shè)置設(shè)置幀率低一點(diǎn),然后用python程序把播放速度提升,幀率也會(huì)相應(yīng)提高。
- 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:如果該位值為T(mén)ure,解碼器會(huì)進(jìn)行顏色框架的解碼,否則會(huì)使用灰度進(jìn)行顏色架構(gòu)
- output_viedo.open(out_path , fourcc, fps, size, isColor=True)
- rval = True
- while rval:
- rval, img = cap.read()#逐幀讀取原視頻
- output_viedo.write(img)#寫(xiě)入視頻幀
- output_viedo.release()
- cap.release()
用opencv處理過(guò)的視頻會(huì)失去音頻。我們也可以使用ffmpeg來(lái)調(diào)速,可以保留聲音,特別適合微調(diào)。要使用FFmpeg,安裝完之后,設(shè)置環(huán)境變量,就能在python調(diào)用FFmpeg。
- import os
- os.system('ffmpeg -i 4.mp4 -vf "setpts=2*PTS" 8.mp4') #圖像兩倍慢速
二、將視頻添加音頻作為背景音樂(lè)
- 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.要將不同的視頻合并,首先要確保幀率和畫(huà)布大小一樣,這樣才能確保合并起來(lái)不出錯(cuò)。下面代碼是調(diào)整畫(huà)布。將形狀不同的視頻畫(huà)面,要按照原視頻的比例,調(diào)整到一個(gè)框里面去。
- import subprocess,os
- import cv2
- #獲取樣本的畫(huà)布大小
- 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:
- #獲取當(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
- 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.將視頻合并
將視頻先轉(zhuǎn)化成ts格式,然后再合并,成功率更高。
- import os
- lista='kaishiwizhi'
- #先獲取這些MP4文件,轉(zhuǎn)換成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)