09_MoviePy創(chuàng)建和導出視頻片段_中文文檔

目錄

創(chuàng)建和導出視頻片段

視頻和音頻剪輯是MoviePy的主要對象感挥。 在本節(jié)中蒋伦,我們介紹不同類型的剪輯溉知,如何創(chuàng)建它們以及如何將它們寫入文件鬼譬。 有關修改片段(剪切娜膘,效果等)的信息,請參見片段轉換和效果优质。 有關如何將剪輯放在一起的信息竣贪,請參見混合剪輯,以及如何在編寫文件之前預覽剪輯巩螃,請參閱如何提高MoviePy的效率演怎。

以下代碼總結了可以使用moviepy創(chuàng)建的基本剪輯:

# VIDEO CLIPS
clip = VideoClip(make_frame, duration=4) # for custom animations (see below)
clip = VideoFileClip("my_video_file.mp4") # or .avi, .webm, .gif ...
clip = ImageSequenceClip(['image_file1.jpeg', ...], fps=24)
clip = ImageClip("my_picture.png") # or .jpeg, .tiff, ...
clip = TextClip("Hello !", font="Amiri-Bold", fontsize=70, color="black")
clip = ColorClip(size=(460,380), color=[R,G,B])

# AUDIO CLIPS
clip = AudioFileClip("my_audiofile.mp3") # or .ogg, .wav... or a video !
clip = AudioArrayClip(numpy_array, fps=44100) # from a numerical array
clip = AudioClip(make_frame, duration=3) # uses a function make_frame(t)

最好地了解這些剪輯是閱讀《參考手冊》中每個剪輯的完整文檔。 下一節(jié)在本節(jié)中避乏,我們將了解如何創(chuàng)建片段(例如爷耀,從視頻或音頻文件中),如何將它們混合在一起以及如何將它們寫入文件中拍皮。

視頻片段的類別

視頻片段是較長視頻的基礎歹叮。 從技術上講跑杭,它們是具有clip.get_frame(t)方法的剪輯,該方法輸出代表時間t處剪輯幀的HxWx3 numpy數(shù)組咆耿。 主要有兩類:動畫剪輯(由VideoFileClip和VideoClip制作)和無動畫剪輯德谅,它們以先驗的無限持續(xù)時間顯示同一張圖片(ImageClip,TextClip萨螺,``ColorClip'')窄做。 還有一些特殊的視頻剪輯調用遮罩,它們屬于上述類別屑迂,但會輸出灰度幀浸策,指示其他剪輯的哪些部分可見或不可見。 視頻剪輯可以包含音頻剪輯(clip.audio)和遮罩剪輯惹盼,音頻剪輯是其音軌庸汗。

VideoClip

VideoClip是MoviePy中所有其他視頻剪輯的基類。 如果您只想編輯視頻文件手报,則永遠不需要它蚯舱。 當您想從另一個庫生成的幀制作動畫時,此類很實用掩蛤。 您所需要做的就是定義一個函數(shù)make_frame(t)枉昏,該函數(shù)返回一個HxWx3 numpy數(shù)組(8位整數(shù)),該數(shù)組表示時間t的幀揍鸟。 這是圖形庫Gizeh的示例:

import gizeh
import moviepy.editor as mpy

def make_frame(t):
    surface = gizeh.Surface(128,128) # width, height
    radius = W*(1+ (t*(2-t))**2 )/6 # the radius varies over time
    circle = gizeh.circle(radius, xy = (64,64), fill=(1,0,0))
    circle.draw(surface)
    return surface.get_npimage() # returns a 8-bit RGB array

clip = mpy.VideoClip(make_frame, duration=2) # 2 seconds
clip.write_gif("circle.gif",fps=15)
image.png

請注意兄裂,使用make_frame進行剪輯的剪輯沒有明確的幀頻,因此必須為write_gif和write_videofile提供幀頻(fps阳藻,每秒幀數(shù))晰奖,更普遍的是,需要迭代這些幀的任何方法腥泥。

VideoFileClip

VideoFileClip是從視頻文件(支持大多數(shù)格式)或GIF文件讀取的剪輯匾南。 您按以下方式加載視頻:

myclip = VideoFileClip("some_video.avi")
myclip = VideoFileClip("some_animation.gif")

請注意,這些剪輯將具有fps(每秒幀數(shù))屬性蛔外,如果您對該剪輯進行了少量修改蛆楞,則將傳輸該屬性,默認情況下夹厌,它們將在write_videofile豹爹,write_gif等中使用。例如:

myclip = VideoFileClip("some_video.avi")
print (myclip.fps) # prints for instance '30'
# Now cut the clip between t=10 and 25 secs. This conserves the fps.
myclip2 = myclip.subclip(10, 25)
myclip2.write_gif("test.gif") # the gif will have 30 fps

有關更多信息矛纹,請參見VideoFileClip帅戒。

ImageSequenceClip

這是由一系列圖像組成的剪輯,您可以使用

clip = ImageSequenceClip(images_list, fps=25)

其中images_list可以是按此順序的圖像名稱(將要播放)的列表崖技,文件夾名稱(在這種情況下逻住,文件夾中的所有圖像文件將按字母數(shù)字順序播放)或幀列表(Numpy數(shù)組) ),例如從其他剪輯中獲得迎献。

提供文件夾名稱或文件名稱列表時瞎访,可以選擇load_images = True來指定所有圖像都應加載到RAM中。 僅當您有少量圖像將被多次使用(例如吁恍,如果圖像形成循環(huán)動畫)時扒秸,這才有意義。

ImageClip

ImageClip是始終顯示相同圖像的視頻剪輯冀瓦。 您可以如下創(chuàng)建一個:

myclip = ImageClip("some_picture.jpeg")
myclip = ImageClip(somme_array) # a (height x width x 3) RGB numpy array
myclip = some_video_clip.to_ImageClip(t='01:00:00') # frame at t=1 hour.

有關更多信息伴奥,請參見ImageClip。

下面顯示的ImageClip的兩個示例是TextClip和ColorClip

TextClip

生成TextClip需要安裝ImageMagick翼闽,并且(對于Windows用戶)鏈接到MoviePy拾徙,請參閱安裝說明。

這是制作文本剪輯的方式(您一直不需要所有這些選項):

myclip = TextClip("Hello", font='Amiri-Bold')

該字體可以是計算機上安裝的任何字體感局,但是ImageMagick將具有特定的名稱尼啡。 例如,普通的Amiri字體將被稱為Amiri-Regular询微,而Impact字體將被稱為Impact-Normal崖瞭。 要獲取可能的字體列表,請鍵入TextClip.list('font')撑毛。 要查找與給定字體相關的所有字體名稱书聚,請使用例如

TextClip.search('Amiri', 'font') # Returns all font names containing Amiri

還要注意,對小寫字母使用筆畫(或輪廓)不能很好地工作藻雌,因此雌续,如果需要帶有輪廓的小文本,最好先生成一個大文本蹦疑,然后將其縮形魅浮:

myclip = TextClip("Hello", fontsize=70, stroke_width=5).resize(height=15)

TextClips有很多選擇:對齊,字距調整(字母之間的距離)歉摧,筆劃大小艇肴,背景,自動換行等叁温。有關更多信息再悼,請參見TextClip剧辐。

Mask clips

遮罩是一種特殊的視頻剪輯脯宿,它指示帶有該遮罩的視頻剪輯將與其他視頻剪輯一起組成時,哪些像素是可見的(請參閱混合剪輯)衙傀。 當您將剪輯導出為GIF文件或PNG時,遮罩還可以用于定義透明度莺奸。

蒙版和標準剪輯之間的根本區(qū)別在于丑孩,標準剪輯輸出的幀每像素具有3個分量(RGB),介于0和255之間灭贷,而蒙版每個像素只有一種成分温学,介于0和1之間(1表示完全可見的像素 0表示透明像素)。 否則甚疟,遮罩將始終處于灰度狀態(tài)仗岖。

創(chuàng)建或加載要用作遮罩的剪輯時,需要聲明它:

maskclip = VideoClip(makeframe, duration=4, ismask=True)
maskclip = ImageClip("my_mask.jpeg", ismask=True)
maskclip = VideoFileClip("myvideo.mp4", ismask=True)

對于視頻和圖像文件览妖,如果還不是黑白文件轧拄,它們將被自動轉換。

然后讽膏,使用myclip.set_mask(maskclip)將此蒙版附加到剪輯(必須具有相同的尺寸)檩电。

某些圖像格式(例如PNG)支持帶有alpha圖層的透明度,MoviePy將其用作遮罩:

myclip = ImageClip("image.png", transparent=True) # True is the default
myclip.mask # <- the alpha layer of the picture.

可以使用clip.to_mask()將任何視頻剪輯轉換為遮罩桅打,并使用my_mask_clip.to_RGB()將遮罩轉換為標準RGB視頻剪輯是嗜。

遮罩在許多方面有不同的處理方式(因為它們的幀不同),但是您可以使用遮罩來處理標準剪輯中幾乎所有的操作:您可以對其進行剪切挺尾,編輯鹅搪,預覽,將其寫入視頻文件遭铺, 制作快照等

導出視頻片段

視頻文件(.mp4丽柿,.webm,.ogv…)

要將片段作為視頻文件寫入魂挂,請使用

my_clip.write_videofile("movie.mp4") # default codec: 'libx264', 24 fps
my_clip.write_videofile("movie.mp4",fps=15)
my_clip.write_videofile("movie.webm") # webm format
my_clip.write_videofile("movie.webm",audio=False) # don't render audio.

MoviePy具有最常見文件擴展名的默認編解碼器名稱甫题。 如果要使用外來格式,或者對默認設置不滿意涂召,可以為編解碼器提供codec ='mpeg4'坠非。 編寫視頻時,有很多選項(比特率果正,音頻編寫的參數(shù)炎码,文件大小優(yōu)化,要使用的處理器數(shù)量等)秋泳。 請參考write_videofile()以獲得更多信息潦闲。

有時MoviePy無法猜測剪輯的持續(xù)時間屬性(請記住,某些剪輯(例如顯示圖片的ImageClip)具有先驗的無限持續(xù)時間)迫皱。 然后歉闰,必須使用clip.set_duration手動設置持續(xù)時間:

# Make a video showing a flower for 5 seconds
my_clip = Image("flower.jpeg") # has infinite duration
my_clip.write_videofile("flower.mp4") # Will fail ! NO DURATION !
my_clip.set_duration(5).write_videofile("flower.mp4") # works !

GIF動畫

要以動畫GIF格式編寫視頻,請使用

my_clip.write_gif('test.gif', fps=12)

請注意,這需要安裝ImageMagick和敬。 否則凹炸,您還可以通過添加選項program ='ffmpeg'來使用ffmpeg創(chuàng)建GIF,它會快得多概龄,但效果不會很好还惠,也不會進行優(yōu)化。

有許多選項可以優(yōu)化gif的質量和大小私杜。 請參考write_gif()。

請注意救欧,編輯gif的最佳方法是按以下說明在筆記本中預覽它們:ipython_display

有關使用示例衰粹,請參見此博客文章,以獲取有關從視頻文件制作GIF的信息笆怠,以及另一篇有關具有矢量圖形的GIF動畫的文章铝耻。

導出圖像

您可以使用以下命令將框架寫入圖像文件

myclip.save_frame("frame.png") # by default the first frame is extracted
myclip.save_frame("frame.jpeg", t='01:00:00') # frame at time t=1h

如果剪輯具有遮罩,除非您指定withmask = False蹬刷,否則它將被導出為圖像的Alpha層瓢捉。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市办成,隨后出現(xiàn)的幾起案子泡态,更是在濱河造成了極大的恐慌,老刑警劉巖迂卢,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件某弦,死亡現(xiàn)場離奇詭異,居然都是意外死亡而克,警方通過查閱死者的電腦和手機靶壮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來员萍,“玉大人腾降,你說我怎么就攤上這事∷橐铮” “怎么了螃壤?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長混卵。 經(jīng)常有香客問我映穗,道長,這世上最難降的妖魔是什么幕随? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任蚁滋,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘辕录。我一直安慰自己睦霎,他們只是感情好,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布走诞。 她就那樣靜靜地躺著副女,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蚣旱。 梳的紋絲不亂的頭發(fā)上碑幅,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天,我揣著相機與錄音塞绿,去河邊找鬼沟涨。 笑死,一個胖子當著我的面吹牛异吻,可吹牛的內(nèi)容都是我干的裹赴。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼诀浪,長吁一口氣:“原來是場噩夢啊……” “哼棋返!你這毒婦竟也來了?” 一聲冷哼從身側響起雷猪,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤睛竣,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后春宣,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體酵颁,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年月帝,在試婚紗的時候發(fā)現(xiàn)自己被綠了躏惋。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡嚷辅,死狀恐怖簿姨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情簸搞,我是刑警寧澤扁位,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站趁俊,受9級特大地震影響域仇,放射性物質發(fā)生泄漏。R本人自食惡果不足惜寺擂,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一暇务、第九天 我趴在偏房一處隱蔽的房頂上張望泼掠。 院中可真熱鬧,春花似錦垦细、人聲如沸择镇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽腻豌。三九已至,卻和暖如春嘱能,著一層夾襖步出監(jiān)牢的瞬間吝梅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工焰檩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留憔涉,地道東北人。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓析苫,卻偏偏與公主長得像,于是被迫代替她去往敵國和親穿扳。 傳聞我的和親對象是個殘疾皇子衩侥,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355