
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)
效果:
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)) #水準居中,向下移動
效果:
音頻:
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