天天看點

python--moviepy--視訊編輯

python--moviepy--視訊編輯

MoviePy是一個用于視訊編輯的python子產品,你可以用它實作一些基本的操作(比如視訊剪輯,視訊拼接,插入标題),還可以實作視訊合成,還有視訊處理,抑或用它加入一些自定義的進階的特效。總之,它的功能還是蠻豐富的。此外,MoviePy可以讀寫絕大多數常見的視訊格式,甚至包括GIF格式!是不是很興奮呢?基于Python2.7以上的版本,MoviePy可以輕松實作跨平台,Mac/Windows/Linux統統沒問題,這也以意味着,MoviePy項目可以部署到服務端,在服務端進行視訊處理。真是福音啊!

安裝:  pip install moviepy -i https://pypi.douban.com/simple

from moviepy.editor import *

video=VideoFileClip("1.mp4")  #導入視訊
vid=video.subclip(50,60)  #截取視訊
#截取00:00:50 - 00:00:60部分

vid.write_videofile("my.MP4")  #把vid視訊寫入my.MP4檔案      

​時間既可以用(t_start=230.54),以秒的時間來表示,也可以用(t_start=(3,50.54)),以3分50.54秒的形式來表示,還可以 (t_start=(0,3,50.54))或者 (t_start=(00:03:50.54)),以,小時,分鐘,秒的形式老表示​

​大多數沒有指派的時間參數會有一個預設值,比如clip.subclip(t_start=50),t_end的預設值就是視訊的長度,clip.subclip(t_end=50),那麼t_start就預設為0.當時間是負數的時候,代表倒數n秒。比如,clip.subclip(-20, -10)會截取倒數20秒到倒數10秒之間的片段​

video.write_videofile("my.mp4",audio=False)  #把視訊寫入檔案
#audio=False   表示去掉音頻;這個指令推薦去掉音頻,因為很容易出錯--後面再加上音頻      
video = vid.subclip(10, vid.duration-12) # 剪輯視訊,從10秒開始到視訊結尾前12秒      

視訊合成: 

from moviepy.editor import *

vid2=VideoFileClip("b.mp4")
vid3=VideoFileClip("c.mp4")

video = concatenate_videoclips([vid2, vid3])  #視訊合成--視訊拼接
#并不需要相同的時長或者大小
#注意:合并視訊的尺寸要一樣,否則後面的視訊會出現花屏
video.write_videofile("my.mp4")      
s=vid1.reader.size  #傳回視訊的尺寸
#[960, 540]      

縮放:

from moviepy.editor import *

vid1=VideoFileClip("a.mp4")
s=vid1.reader.size  #傳回視訊的尺寸
#[960, 540]
print(s)
s=vid1.reader.fps  #傳回的幀率
v=vid1.resize(0.5)  #尺寸等比縮放0.5
#注意:隻有寫入檔案後才有效果

v.write_videofile("my.mp4")      
vid=VideoFileClip("a.mp4")
s=vid.reader.size
print('原視訊尺寸:',s)
vid1=vid.resize(width=480)  #修改視訊的尺寸
#當我們寫出clip.resize(width=480),moviepy并不是立刻就逐幀修改clip。一般隻會先修改第一幀,其他的左右的幀隻有在需要的時候(最後寫入檔案或者預覽)才會被resize。另一方面,可以這樣講,建立一個clip,幾乎是不會占用時間和記憶體的,幾乎所有的計算其實發生在最後轉換的時刻
#寬高都是同時按比例修改的      
video = vid.speedx(2)  # 2倍速      
vid.save_frame("frame.jpeg")        #儲存第一幀
vid.save_frame("frame.png", t=2)    #儲存2s時刻的那一幀      
vid=VideoFileClip("a.mp4")
txt = TextClip("my sipin 2019",fontsize=70,color='white')  #建立文本對象
#不支援中文
txt = txt.set_pos('center').set_duration(10)   # 文本clip在螢幕正中顯示持續10秒
video = CompositeVideoClip([vid, txt])  #把文本合成到視訊中      
vid=VideoFileClip("a.mp4")
vid1 = vid.fx(vfx.mirror_x)   #x軸鏡像
vid2 = vid.fx(vfx.mirror_y)  #y軸鏡像

video = clips_array([[vid, vid1],[vid, vid2]])  #視訊疊加

video.write_videofile("my.mp4",audio=False)      

效果:

python--moviepy--視訊編輯
vid=VideoFileClip("b.mp4")
vid1=VideoFileClip("a240.mp4")

video = CompositeVideoClip([vid,vid1.set_pos((45,150))])  #前後疊加合成
#參數2視訊在參數1視訊的前面
#合成之後的視訊尺寸是參數1視訊的尺寸
#set_pos((45,150)  是視訊的坐标位置      
vid=VideoFileClip("b.mp4")      

set_pos("center") #居中

set_pos(("center","top")) #水準方向居中,垂直方向在頂部

set_pos(("left","center")) #水準方向在左邊,垂直方向居中

set_pos((0.4,0.7), relative=True) #0.4倍寬處,0.7倍高處

set_pos(lambda t: ('center', 50+t)) #水準居中,向下移動

效果:

python--moviepy--視訊編輯

音頻: 

vid=VideoFileClip("b.mp4")
audioclip =AudioFileClip("b.mp4")  #從視訊檔案中提取音頻
audioclip1 =vid.audio   #從視訊對象中提取音頻
audioclip.write_audiofile('b.mp3')  #寫入音頻檔案      
vid=VideoFileClip("mywusen.mp4")  #無聲視訊
audioclip =AudioFileClip("b.mp4")  
video = vid.set_audio(audioclip)  #音頻視訊合成

video.write_videofile("my.mp4")      

解決錯誤問題: 

出現 'NoneType' object has no attribute 'stdout'

moviepy中文手冊   ​​http://www.moviepy.com.cn/thread-30-1-1.html​​ 

python--moviepy--視訊編輯