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) 是視頻的坐標位置
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'
參看:https://blog.csdn.net/RocHoo/article/details/103273603
moviepy中文手冊 http://www.moviepy.com.cn/thread-30-1-1.html