☞ ░ 前往老猿Python博文目錄 ░
一、概述
在《moviepy音視頻剪輯:moviepy中的剪輯相關類及關係》介紹了剪輯相關類及關係,其中VideoClip有多個直接子類和間接子類。
本文中將介紹的DataVideoClip、UpdatedVideoClip、ImageClip、ColorClip、TextClip都是VideoClip的子類,其中DataVideoClip、UpdatedVideoClip在前面文中未進行介紹,之所以將這幾個類在此一併介紹,是因爲這幾個類都在VideoClip類相同的模塊文件VideoClip.py中。
二、DataVideoClip
DataVideoClip是VideoClip的直接子類,它的視頻剪輯的連續幀都是從一系列數據集經過函數處理生成的,DataVideoClip類只有構造方法,沒有獨有屬性和其他方法,因此DataVideoClip其實就是通過數據集經函數處理構造的視頻剪輯。
構造方法如下:
__init__(self, data, data_to_frame, fps, ismask=False, has_constant_size=True)
說明:
- data:用於生成視頻剪輯的原始數據集列表
- data_to_frame:用於對數據進行處理的函數,帶一個參數爲生成一個幀的原始數據,data_to_frame對該數據進行處理後生成幀數據
- fps:生成剪輯的幀率
- has_constant_size:與父類的has_constant_size參數相同
實際上處理時,是將剪輯t時刻的幀取data[int(fps*t)]中的數據進行處理。
三、UpdatedVideoClip
UpdatedVideoClip是VideoClip的直接子類。
構造方法語法如下:
__init__(self, world, ismask=False, duration=None)
說明:
- UpdatedVideoClip的構造方法是個閉包,其內定義了用於構造幀的嵌套函數make_frame
- 參數world是一個有特殊要求的對象,該對象必須有一個屬性clip_t、兩個方法update和to_frame:
- world.clip_t :與world狀態對應的剪輯時間
- world.update()方法:更新world的狀態(包括增加clip_t一個時間步)的方法
- world.to_frame()方法:根據world的狀態生成一個幀的方法
- ismask:如果生成的剪輯是值爲0-1 WxH遮罩則爲True
- duration:剪輯的時長,單位是秒
對應剪輯生成t時刻的幀時,如果world的clip_t 小於t,則會循環執行world.update方法,直到clip_t 大於等於t,此時再調用world.to_frame()輸出幀。
UpdatedVideoClip的幀數據依賴於world對象狀態變更,該類在科學研究中有特殊用途,對於那些在生成幀數據前需要使用算法執行一些步驟進行處理時特別有用。
四、ImageClip
4.1、概述
ImageClip是VideoClip的直接子類,用於生成固定不變的視頻剪輯。ImageClip是從一個圖像文件或內存中圖像數組數據生成的視頻剪輯,對應視頻任何時候都是顯示該圖像。
4.2、構造方法
4.2.1、調用語法:
__init__(self, img, ismask=False, transparent=True,fromalpha=False, duration=None)
4.2.2、參數說明:
- img:任何圖像文件或代表一個RGB圖像的數組(例如一個視頻剪輯的幀數據)
- ismask:剪輯是否爲遮罩,如果要構建遮罩剪輯需要設置爲True
- transparent:如果希望圖片的alpha層(如果存在)用作構建剪輯的遮罩,此參數應設置爲True,此時圖像的背景層作爲視頻剪輯,圖片的alpha層作爲剪輯的遮罩剪輯
- fromalpha:如果只是將圖片的alpha層構建剪輯,則fromalpha應設置爲True
4.2.3、案例
針對ImageClip的構造方法,如果使用不帶alpha通道的圖片轉爲剪輯,則如果ismask爲True,則彩色圖像會變成灰色剪輯,否則會保持彩色圖像,transparen和fromalpha這兩個參數不起作用。下面截圖中顯示了原圖像、標準剪輯、遮罩剪輯的對比:
帶alpha通道的圖像製作的剪輯情況比較複雜,處理結果無法完全解釋,在此不進行展開介紹。
4.3、fl方法、fl_image方法和fl_time方法
- fl方法:與父類的VideoClip.fl方法是等效的,但返回值不再是ImageClip對象,而是VideoClip對象
- fl_image方法:和父類 VideoClip.fl_image方法功能相同,但ImageClip中由於每個幀相同,因此僅在最開始進行一次變換
- fl_time方法:ImageClip的fl_time方法對ImageClip不進行任何處理,因爲ImageClip任何時刻都是固定圖像,但該方法可能會影響剪輯的遮罩或音頻。返回值是一個ImageClip對象
五、ColorClip
ColorClip是僅顯示同一種顏色的剪輯。
5.1、構造方法
調用語法:
__init__(self, size, color=None, ismask=False, duration=None, col=None)
參數說明:
- size:剪輯的大小,一個寬和高組成的元組
- color:如果ismask爲False,則爲一個RGB的三元組(缺省爲黑色全0),如果ismask爲True,則color代表灰度值,爲一個0到1之間的浮點數
- ismask:是否將剪輯作爲遮罩
- duration:剪輯時長
- col:已經廢棄參數,被color所代替
六、TextClip
TextClip用於生成文本剪輯,對應剪輯內容來自於指定文本或文本文件,TextClip是ImageClip的直接子類。在具體處理時,TextClip先調用ImageMagick將文本轉換成一個png圖片,再調用ImageClip的構造方法將該圖片構造成剪輯,因此使用TextClip前需要先下載並安裝ImageMagick應用(不是Python模塊)。安裝ImageMagick後,還需要修改moviepy的config_defaults.py模塊的配置,將下行代碼:
IMAGEMAGICK_BINARY = os.getenv('IMAGEMAGICK_BINARY', 'auto-detect')
替換爲:
IMAGEMAGICK_BINARY = r"C:\Program Files\ImageMagick-7.0.8-Q16\magick.exe"
具體的替換值需要確認ImageMagick安裝目錄進行更改。
說明:
ImageMagick是一套功能強大、穩定而且開源的多平臺工具集和開發包,可以用來讀、寫和處理超過200種基本格式的圖片文件,包括PNG,JPEG,GIF,HEIC,TIFF,DPX,EXR,WebP,Postscript,PDF和SVG等格式。利用ImageMagick,可以根據web應用程序的需要動態生成圖片, 還可以對一個(或一組)圖片進行改變大小、旋轉、銳化、減色或增加特效等操作,並將操作的結果以相同格式或其它格式保存,對圖片的操作,既可以通過命令行進行,也可以通過C/C++、Perl、Java、PHP、Python或Ruby編程來完成。ImageMagic的主要精力集中在性能,減少bug以及提供穩定的API和ABI上。
ImageMagick的功能通常通過命令行使用,也可以通過編程來使用。moviepy使用的方式就是通過命令行方式調用的。因此在使用TextClip前,必須安裝獨立的ImageMagick應用,該應用對應官方下載地址爲:
http://www.imagemagick.org/script/index.php,該網站從國內訪問非常慢,老猿好不容易纔弄到該工具包的windows 64位16通道圖像處理的版本放在CSDN的資源服務器上,如果大家需要使用該版本可以從CSDN的資源服務器對應鏈接下載,下載地址爲:https://download.csdn.net/download/LaoYuanPython/12539159,不過需要5個CSDN積分,但下載快,下載後解壓直接點擊執行文件運行即可。
6.1、構造方法
TextClip的構造方法語法如下:
__init__(self, txt=None, filename=None, size=None, color='black',
bg_color='transparent', fontsize=None, font='Courier',
stroke_color=None, stroke_width=1, method='label',
kerning=None, align='center', interline=None,
tempfilename=None, temptxt=None,
transparent=True, remove_temp=True,
print_cmd=False)
構造方法參數說明:
- txt:需要在剪輯中顯示的文字,這個參數和參數filename可以相互替換,二者同時存在時txt優先
- filename:存儲需要在剪輯中顯示文字的文件名
- size:剪輯的大小,如果method參數爲’label’可以設置爲None,由moviepy自動根據文字設定,但如果method參數爲’caption’,則必須設置,此時高度也可以設置爲None,由moviepy根據文字數量、大小以及寬度自動設置
- color:文字顯示的前景色,請參考下面介紹list方法時的說明
- bg_color:剪輯的背景色
- fontsize:文字字體大小
- font:字體設置,字體和運行機器相關,在機器上能使用的字體請參考下面介紹list方法時的說明
- stroke_color:文字輪廓線的顏色,如果爲None則沒有輪廓線
- stroke_width:輪廓線的寬度,可以爲浮點數
- method:可以設置爲’label’或’caption’,設置爲’label’時,圖片將自動調整大小以適合剪輯的大小,這是該參數的缺省值。設置爲’caption’時,文字將在size參數指定範圍內顯示,此時文字會自動換行,但自動換行功能由於使用的ImageMagick庫的問題有時不能正確工作
- kerning:更改字母之間的默認間距。例如
kerning=-1
與默認間距相比,將使字母之間的間距更接近1個像素 - align:文字的對齊方式,僅在method設置爲caption時生效,確實值爲center,可選擇的值包括:center 、 East 、 West 、 South 、 North
- transparent:如果要考慮圖像的透明度需要設置爲True,這也是缺省值
- remove_temp:是否刪除臨時文件
6.2、list方法
list方法用於返回TextClip構造方法中font和color參數在執行機器上可以使用的相關取值列表。
調用語法爲:
list(arg)
其中參數arg只有兩個取值‘font’和‘color’,注意該方法是一個靜態方法,直接帶類名就可以調用。
注意:
由於moviepy對多語言環境支持存在一些問題,因此在執行TextClip.list(‘font’)會報錯,報錯信息爲:
File "C:\Program Files\Python37\lib\site-packages\moviepy\video\VideoClip.py", line 1177, in list
return [l.decode('UTF-8')[8:] for l in lines if l.startswith(b" Font:")]
File "C:\Program Files\Python37\lib\site-packages\moviepy\video\VideoClip.py", line 1177, in <listcomp>
return [l.decode('UTF-8')[8:] for l in lines if l.startswith(b" Font:")]
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb7 in position 8: invalid start byte
在這種情況下,要支持中文環境,需要修改VideoClip的1177行,具體修改內容如下:
if arg == 'font':
#return [l.decode('UTF-8')[8:] for l in lines if l.startswith(b" Font:")]
return [l.decode('ANSI')[8:] for l in lines if l.startswith(b" Font:")]
6.3、search方法
search方法也是一個靜態方法,直接帶類名就可以調用,該方法是作爲list方法的一個補充使用,因爲list ‘font’和‘color’後,這兩個類型一般取值都很多,因此輸出會很多內容,不方便查看,而search除了指定參數名外,還可以對參數可取值進行過濾。實際上search實現時,也是先執行list方法,將list方法的結果再進行一次過濾再輸出。
調用語法:
search(string, arg)
其中參數arg與list中的arg一樣,而string是過濾條件的字符串,該字符串不區分大小寫,最終結果只顯示參數可取值中包含了string字符串內容的可取值。
七、小結
本節詳細介紹了VideoClip文件中包含的VideoClip的所有子類,這些子類可以在特定場景下使用,需要注意的是TextClip是基於安裝了ImageMagick才能使用。
更多moviepy的介紹請參考《PyQt+moviepy音視頻剪輯實戰文章目錄》或《專欄:使用PyQt開發圖形界面Python應用》。
廣告
老猿關於PyQt的付費專欄《使用PyQt開發圖形界面Python應用》只需要9.9元,本專欄《PyQt+moviepy音視頻剪輯實戰》文檔的同樣內容在付費專欄上也有相應內容,總體來說付費專欄介紹更詳細或案例更多。
本節內容對應付費專欄的《moviepy音視頻剪輯:視頻基類VideoClip子類DataVideoClip、UpdatedVideoClip、ImageClip、ColorClip、TextClip及使用案例》。如果有興趣也願意支持老猿的讀者,歡迎購買付費專欄。