moviepy音視頻剪輯:視頻基類VideoClip子類VideoFileClip、CompositeVideoClip、ImageSequenceClip介紹

☞ ░ 前往老猿Python博文目錄

一、引言

在《moviepy音視頻剪輯:moviepy中的剪輯相關類及關係》介紹了VideoClip主要有六個直接子類(VideoFileClip、 ImageSequenceClip、CompositeVideoClip、ImageClip、DataVideoClip、UpdatedVideoClip)和兩個間接子類(ColorClip, TextClip)。在《moviepy音視頻剪輯:視頻基類VideoClip子類DataVideoClip、UpdatedVideoClip、ImageClip、ColorClip、TextClip類詳解》介紹了DataVideoClip、UpdatedVideoClip、ImageClip、ColorClip、TextClip類,這是因爲這幾個子類都與VideoClip類在同一模塊文件VideoClip.py中。本文將介紹VideofileClip、 ImageSequenceClip、CompositeVideoClip這三個子類。

二、VideoFileClip視頻文件剪輯

2.1、概述

VideoFileClip類是VideoClip的直接子類,是從一個視頻文件創建一個剪輯類,除了從父類繼承的特性和方法外,VideoFileClip實現了自己的構造方法和close方法,另外VideoFileClip有1個自己獨的屬性filename。VideoFileClip加載視頻文件時,可以調整剪輯對應分辨率大小,可以根據應用要求設定是否加載音頻。VideoFileClip加載視頻文件時,會調用FFMPEG_VideoReader來加載視頻文件,加載時會對視頻文件進行加鎖處理。

2.2、filename屬性

filename屬性用於存儲讀取視頻文件的文件名,該文件名與讀取視頻文件給的名字完全一致,無需進行本地化路徑轉換。

2.3、構造方法

調用語法:
__init__(self, filename, has_mask=False,
                 audio=True, audio_buffersize=200000,
                 target_resolution=None, resize_algorithm='bicubic',
                 audio_fps=44100, audio_nbytes=2, verbose=False,
                 fps_source='tbr')
參數說明:
  • filename:視頻文件名,可以帶路徑
  • has_mask:是否有遮罩 ,如果視頻文件帶遮罩,則設置has_mask爲True。視頻文件一般很少帶遮罩,但有些視頻編碼支持遮罩功能。例如如果moviepy合成了一個帶遮罩的剪輯,則可以使用《moviepy音視頻剪輯:視頻剪輯基類VideoClip的屬性及方法詳解》介紹的VideoClip.write_videofile將剪輯和遮罩、音頻信息一起保存到視頻文件中
  • audio:如果視頻文件不帶音頻或者不希望加載視頻文件的音頻,可以將audio參數設置爲False
  • audio_buffersize:音頻文件讀取緩衝區大小,字節爲單位,一般用缺省值足夠,如果audio_buffersize比一個音頻幀的大小還要小,會自動使用音頻幀的大小代替
  • target_resolution:設置爲加載後需要變換到的分辨率,類型爲列表或元組,第一個元素爲分辨率的高,第二個爲寬,如果高或寬有一個爲None,則保持現有縱橫比調整幀的大小。如果保持原分辨率不變,則不需要設置本參數或設置爲None。如果設置了新的分辨率,則在調用ffmpeg 返回視頻剪輯的幀之前會按新的分辨率調整幀的大小。這比使用轉換爲高分辨率流然後再調整分辨率會快很多
  • resize_algorithm:要改變加載後的視頻分辨率,可以通過resize_algorithm指定調整分辨率的算法,缺省值爲 “bicubic”,還可以是 “bilinear” 、"fast_bilinear"等。關於算法的更多信息請參考:https://ffmpeg.org/ffmpeg-scaler.html
  • audio_fps:聲音的採樣頻率
  • audio_nbytes:聲音採樣的位數
  • verbose:是否在標準輸出設備上顯示處理信息
  • fps_source:從視頻的元數據metadata哪個數據中獲取fps值,默認設置爲’tbr’,但可以設置爲’fps’,這可能有助於導入慢動作視頻,否則可能會出意外。

2.2、close方法

構造方法會對視頻文件進行加鎖,並佔用相關資源,如果要釋放文件和資源,需要調用close方法或等加載處理的進程結束。close方法除了self無其他參數,其目的就是釋放文件和其他佔用的資源。

需要注意,如果一個VideoFileClip實例被淺拷貝到另一個對象,這兩個對象中任意一個調用close方法都可能會釋放文件導致另一個實例的close方法失敗。具體情況與代碼的上下文環境相關。

三、CompositeVideoClip合成視頻剪輯

3.1、概述

CompositeVideoClip是一種由其他視頻剪輯組合構成一起播放的視頻剪輯,這是大多數合成剪輯的基類。《moviepy音視頻剪輯:使用concatenate_videoclips和clips_array將多個視頻合成一個順序播放或同屏播放的視頻》介紹的concatenate_videoclips在method參數設置爲’compose’時,實際上就是調用的CompositeVideoClip完成合成的。

3.2、構造方法

調用語法:

__init__(self, clips, size=None, bg_color=None, use_bgclip=False,ismask=False)

參數說明:
  • clips:多個視頻剪輯的列表,列表中的每個元素都是VideoClip類型的對象。列表中的每個剪輯都將顯示在列表中其後面出現的剪輯的下面。每個剪輯的pos屬性決定剪輯放置在最終合成剪輯屏幕的位置,每個剪輯的mask遮罩屬性決定每個剪輯哪部分可見哪部分不可見
  • size:最終剪輯的大小(分辨率),如果size爲None,則將clips中第一個剪輯的size作爲最終剪輯的size
  • bg_color:設置合成剪輯的背景色,背景色用於剪輯未填充且無遮罩的區域,如果要一個透明剪輯,則設置爲None,否則爲一個代表RGB顏色的三元組,如(0,0,0)代表黑色,也即透明色。該參數只有use_bgclip爲False的情況下使用,實際上是通過構建一個由bg_color指定顏色的ColorClip來實現的
  • use_bgclip:如果列表中的第一個剪輯應用作所有其他剪輯的“背景”,則設置爲True。第一個剪輯的大小必須與最後合成剪輯的大小相同。如果沒有透明度,則最終剪輯將沒有遮罩
  • ismask:最終合成剪輯是否爲遮罩剪輯。

3.2、clips屬性

clips屬性保存合成剪輯所需要的所有剪輯的列表,但不包含背景剪輯,即如果use_bgclip爲True,則clips保存的爲構造方法clips參數對應列表第二個及之後的所有剪輯,如果use_bgclip爲False,則就是構造方法clips參數對應的列表。

3.3、playing_clips方法

playing_clips方法用於判斷clips屬性中對應剪輯在參數指定的t時刻是否處於播放狀態,對處於播放狀態的剪輯存放到一個列表中返回。

調用語法:playing_clips(self, t=0)

3.4、close方法

用於關閉音頻及由CompositeVideoClip創建的背景剪輯,其他資源的釋放不處理。

四、ImageSequenceClip圖像序列剪輯

4.1、引言

在《moviepy音視頻剪輯:視頻剪輯基類VideoClip的屬性及方法詳解》介紹了write_images_sequence方法,write_images_sequence方法用於將剪輯輸出到一系列圖像文件中,而ImageSequenceClip則基本上與write_images_sequence過程可逆,用於將一系列圖像生成剪輯。

ImageSequenceClip是VideoClip的直接子類,該類自身只有構造方法,其他方法和屬性都是繼承自父類。

4.2、構造方法

調用語法:
__init__(self, sequence, fps=None, durations=None, with_mask=True,
                 ismask=False, load_images=False)
參數說明:
  • sequence:參數sequence可以是如下三種之一
  • 一個僅包含圖片的文件夾路徑目錄名,目錄下的文件將按字母順序排列作爲處理的系列圖像文件
  • 一個圖像文件名的列表,在這種情況下開發者可以通過load_images參數控制選擇將文件圖像一次性加載到內存中
  • 一個表示圖像的numpy數組列表,注意這種情況不支持遮罩
  • fps:每秒讀入的圖像幀數,該參數可以通過設定durations來替代
  • durations:每個圖像在剪輯中顯示的時長列表,因此可以給每個圖像不同的播放時間,如果設置了fps,該參數將不起作用
  • with_mask:是否將PNG圖像的alpha層作爲遮罩
  • ismask:是否將生成剪輯作爲遮罩
  • load_images:是否在處理前集中將圖像文件加載到內存,如果爲True,則對於sequence對應圖像文件的情況,一次性的將所有圖像文件先加載到內存,否則每處理一個文件加載一個。該參數僅對sequence爲文件名列表的情況生效。

更多moviepy的介紹請參考《PyQt+moviepy音視頻剪輯實戰文章目錄》或《專欄:使用PyQt開發圖形界面Python應用》。

廣告

老猿關於PyQt的付費專欄《使用PyQt開發圖形界面Python應用》只需要9.9元(老猿正在考慮是否調整專欄價格,如果調整價格至少是19.9元),本專欄《PyQt+moviepy音視頻剪輯實戰》文檔的同樣內容在付費專欄上也有相應內容,總體來說付費專欄介紹更詳細或案例更多。

本節內容對應付費專欄的《moviepy音視頻剪輯:視頻基類VideoClip子類VideoFileClip、CompositeVideoClip、ImageSequenceClip介紹及使用案例》。如果有興趣也願意支持老猿的讀者,歡迎購買付費專欄。

跟老猿學Python、學5G!

☞ ░ 前往老猿Python博文目錄

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章