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)

效果:

 

 

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 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM