moviepy音視頻剪輯:moviepy中的剪輯基類Clip的屬性和方法詳解


一、概述

在moviepy中,所有剪輯的基類是Clip,對應的模塊為moviepy.Clip,常用的剪輯類包括:VideoClip、AudioClip、VideoFileClip、AudioFileClip、ImageSequenceClip、ImageClip、CompositeVideoClip、CompositeAudioClip、TextClip、ColorClip,它們之間的繼承關系如下:
在這里插入圖片描述

二、Clip類的屬性

2.1、start屬性

start屬性用於多個子剪輯拼接成一個剪輯的場景,每個子剪輯通過設置自己的start來指定自己在合成后的剪輯中的播放開始時間,該屬性通過方法set_start來設置。

set_start語法:

set_start(self, t, change_end=True)

說明:

該方法會返回一段調用者的淺拷貝剪輯,該拷貝剪輯的start會被設置為t。
其中:

  • t為需要設置的開始時間,表示方法可以是如下四種之一:
  • 秒,為一個浮點數數字,如75.35;
  • 分鍾和秒組成的元組,如(1,15.35);
  • 時、分、秒組成的元組,如(0,1,15.35)
  • 用冒號分隔的時間字符串,如‘0:1:15.35’

下面剪輯的時間參數如無特別說明都可以是這四種形式的時間。

  • change_end,表示是否修改剪輯的end的值
  • 如果為False,則copy剪輯的end值保持不變,當end存在有效值時,copy剪輯的duration屬性被設置為end-start
  • 如果為True,且剪輯duration存在有效值,則拷貝剪輯的end屬性被更改為:start+duration

2.2、end屬性

end屬性用於多個子剪輯拼接成一個剪輯的場景,每個子剪輯通過設置自己的end來指定自己在合成后的剪輯中的播放的結束時間,該屬性通過方法set_end來設置。

set_end語法

set_end(self, t)

說明:
  • 類似set_start方法,該方法返回一個調用者的拷貝剪輯,該拷貝剪輯的end被設置為t
  • 如果該拷貝剪輯設置了start屬性,則剪輯的duration屬性會被設置為end-start,start屬性保持不變
  • 如果該拷貝剪輯未置start屬性,則duration屬性保持不變,start屬性被設置為max(0,end-duration)

2.3、duration屬性

duration屬性保存剪輯的時長,如果為None,表示剪輯無限長。可以調用set_duration改變剪輯的時長。

set_duration調用語法:

set_duration(self, t, change_end=True)

2.4、memoize屬性

memoize屬性用於控制剪輯是否應保留內存讀取的最后一幀,如果為True保留,否則不保留,默認值為False,可以通過方法set_memoize進行修改。

set_memoize 調用語法:

set_memoize(self, memoize)

2.5、memoized_t、memoized_frame屬性

當memoize為True時,則memoized_t、memoized_frame用於保存最后一次讀取的幀的位置和對應的幀。

三、Clip類的方法

3.1、copy方法

copy方法會將調用者對應剪輯用淺拷貝(Shallow copy )方式復制一份,如果對應剪輯有音軌和遮罩,同樣會淺拷貝復制到新剪輯中。

調用語法:copy(self)

3.2、get_frame方法

get_frame方法返回剪輯指定時刻位置的視頻或音頻幀,每個幀實際上一個表示RGB圖像或音頻的numpy類型數組。

調用語法:get_frame(self, t)

如果剪輯的memoize屬性為True,則會使用memoized_t、memoized_frame保留訪問幀的位置和幀數據。

3.3、fl方法

fl方法是一個通用的剪輯處理方法,它返回一個新剪輯,新剪輯的所有幀是當前調用剪輯對象的幀經過函數fun變換處理后的幀。

調用語法:

fl(self, fun, apply_to=None, keep_duration=True)

說明:
  • fun:參數fun是對剪輯幀進行變換的函數,帶2個參數,第一個參數gf表示當前剪輯的get_frame方法,第二個參數為以秒為單位的剪輯位置t,t會作為gf的參數。fun函數的返回值為經過變換后的幀
  • apply_to:apply_to表示變換過濾器fl是否需要同時作用於剪輯的音頻和遮罩,其值可以為’mask’、‘audio’、[‘mask’,‘audio’]
  • keep_duration:如果為True表示不改變剪輯的duration屬性

3.4、fl_time方法

fl_time方法返回一個新剪輯,新剪輯是調用剪輯的一個淺拷貝,但新剪輯的時間線被調整,實際上這個方法就是對剪輯進行一個基於時間特效的處理,如快播、慢播、倒序播放等。

調用語法:

fl_time(self, t_func, apply_to=None, keep_duration=False)

說明:

3.5、fx方法

fx方法是用於執行參數指定的函數,並返回函數的執行結果。

調用語法:

fx(self, func, *args, **kwargs)

說明:

該方法等同於執行:func(self, *args, **kwargs)
這個方法的用途是當需要使用一系列方法依次調用處理剪輯且每個方法返回的新剪輯作為下次調用者時可以簡化語句。

3.6、set_fps方法

set_fps方法非常簡單,就是用於設置fps的值,調用方法為:set_fps(self, fps),但該方法修改的不是調用剪輯對象的值,而是調用對象剪輯的淺拷貝對象的fps值,返回對象為新剪輯。

3.7、set_ismask方法

set_ismask方法非常簡單,就是用於設置是否有遮罩,調用方法為:set_ismask(self, ismask)`,但該方法修改的不是調用剪輯對象的值,而是調用對象剪輯的淺拷貝對象的ismask值,返回對象為新剪輯。

3.8、is_playing方法

該方法用於判斷對應時間是否在剪輯的start和end之間。

調用語法:is_playing(self, t)
說明:

如果t是一個時間,且位於剪輯的start和end之間,則返回True,否則返回False。
如果t是一個numpy數組,如果數組的所有元素代表時間都不在剪輯的start和end之間則返回False,否則返回一個向量[b_1, b_2, b_3…], 如果數組指定位置i的時間在剪輯的start和end之間,則b_i為True,否則為False。

3.9、subclip方法

subclip方法用於從調用剪輯中取指定的剪輯段構造一個新剪輯對象返回,原剪輯保持不變。

調用語法:subclip(self, t_start=0, t_end=None)
說明:

返回調用剪輯的t_start到t_end之間的剪輯段,如果t_end為None,則t_end被設置為剪輯的duration,如果t_end為負數,則t_end被設置為剪輯的duration + t_end。

3.10、cutout方法

cutout方法將調用剪輯對象的剪輯去除掉指定位置段后返回。

調用語法:cutout(self, ta, tb)
說明:

返回調用剪輯對象的剪輯去除ta到tb這一段之后的剪輯,如果原剪輯設置了duration屬性,則返回剪輯的duration=原剪輯的duration-(tb - ta)。

3.11、iter_frames方法

iter_frames方法不是一個剪輯編輯的方法,其功能是為了迭代訪問剪輯的所有幀,返回值為一個迭代器,每迭代一次返回下一幀。

調用語法:

iter_frames(self, fps=None, with_times = False, logger=None, dtype=None)

說明:
  • iter_frames方法將剪輯的每幀作為一個HxWxN的numpy數組返回,N為1表示遮罩剪輯幀,N=3為RGB剪輯幀
  • 如果剪輯本身有fps參數,則fps為可選參數
  • 使用圖片流編寫視頻時,dtype設置為“uint8”

3.12、close方法

釋放剪輯使用的所有資源。

廣告

老猿關於PyQt的付費專欄《使用PyQt開發圖形界面Python應用》只需要9.9元,本專欄《PyQt+moviepy音視頻剪輯實戰》文檔的同樣內容在付費專欄上也有相應內容,總體來說付費專欄介紹更詳細或案例更多。本節內容對應付費專欄的《moviepy音視頻剪輯:moviepy中的剪輯基類clip詳解》。如果有興趣也願意支持老猿的讀者,歡迎購買付費專欄。

跟老猿學Python、學5G!


免責聲明!

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



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