一、概述
在本地進行音視頻處理時,首先要從視頻文件進行音視頻加載,最后要將處理結果輸出到文件。本節介紹moviepy的音視頻的加載和輸出方法。
二、視頻加載
2.1、視頻加載方法
要從視頻文件中加載視頻非常簡單,使用VideoFileClip類的構造方法即可完成加載。其構造方法語法如下:
__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')
2.1.1、參數釋義
-
filename:視頻文件名,只要是ffmpeg支持的視頻文件如 .ogv, .mp4, .mpeg, .avi, .mov等都可以
-
has_mask:如果視頻文件中包含遮罩該參數設置為“True”
-
audio:如果視頻沒有聲音或者希望加載時不讀取音頻,則應該將audio設置為False
-
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.1.2、返回值
返回值為VideoFileClip實例對象。
2.2、代碼樣例
下面這段代碼取1.mp4的分辨率作為2.mp4加載時的分辨率
import moviepy.editor as mpe
clip1 = mpe.VideoFileClip("1.mp4")
clipSize = clip1.size
clip2 = mpe.VideoFileClip("2.mp4",verbose=True,target_resolution=[clipSize[1],clipSize[0])
三、音頻的加載
要從音頻文件中加載音 頻非常簡單,使用AudioFileClip類的構造方法即可完成加載。其構造方法語法如下:__init__(self, filename, buffersize=200000, nbytes=2, fps=44100):
相關參數的含義除了filename指向音頻文件外,其他與VideoFileClip對應參數含義一致,nbytes對應VideoFileClip的audio_nbytes。
返回值為一個AudioFileClip對象。
四、音視頻的輸出
4.1、視頻的輸出方法
視頻輸出的方法為VideoFileClip的write_videofile方法,語法如下:
def write_videofile(self, filename, fps=None, codec=None,
bitrate=None, audio=True, audio_fps=44100,
preset="medium",
audio_nbytes=4, audio_codec=None,
audio_bitrate=None, audio_bufsize=2000,
temp_audiofile=None,
rewrite_audio=True, remove_temp=True,
write_logfile=False, verbose=True,
threads=None, ffmpeg_params=None,
logger='bar')
部分前面沒有出現的參數說明如下:
- codec:用於圖像編碼的編解碼器,可以是ffmpeg支持的任何編解碼器。如果文件名的擴展名為“.mp4”、“.ogv”、“.webm”,則會相應地設置編解碼器,但如果不喜歡默認值,則仍可以進行設置。對於其他擴展名,必須相應地設置輸出文件名。一些常用的編解碼器如下:
- ‘libx264’:視頻壓縮效果好的一款編解碼器,MP4的缺省編解碼器,視頻質量通過bitrate參數調節
- ‘mpeg4’:一種可選的MP4編解碼器,可以替代’libx264’,可以獲得更好的視頻質量
- ‘rawvideo’:完美的視頻質量,但文件會巨大,對應視頻文件為’.avi’
- ‘png’:完美的視頻質量,對應視頻文件為’.avi’,但文件大小比’rawvideo’小
- ‘libvorbis’:是一種完全開放、免費的編解碼器,有不錯的視頻格式,但是要不廣,對應視頻文件為’.ogv’
- ‘libvpx’:一種很適合在HTML5中使用的網絡視頻輕量級編開源解碼器,對應視頻文件為’.webm’
- audio:可以為True、False或文件名,如果True且剪輯附加了音頻,則音頻將作為視頻的音頻保存,如果為False則不保存音頻,如果為音頻文件名則將此音頻文件將作為視頻的音頻
- temp_audiofile:如果輸出由音頻,則該參數用於指定要生成並合並到電影中的臨時音頻文件的名稱,如果沒有指定則用缺省模式的臨時文件名
- audio_codec:音頻解碼器,例如’.mp3’的’libmp3lame’、‘ogg’的’libvorbis’、 ‘m4a’的’libfdk_aac’、 ‘pcm_s16le’ 16位聲音和’pcm_s32le’的32位聲音。默認值為“libmp3lame”,除非視頻擴展名為“ogv”或“webm”,在這2種情況下,默認值為“libvorbis”。
- audio_bitrate:音頻比特率,字符串形式,如“50k”、“500k”、“3000k”,用於將確定輸出文件中音頻的大小/質量。請注意,這主要是一個指示性目標,輸出文件的比特率不一定會按此設置。
- preset:設置FFMPEG用於優化壓縮的時間。字符串類型,可選值有:ultrafast、superfast、veryfast、faster、fast、medium、slow、slower、veryslow、 placebo。請注意,這不會影響視頻的質量,只影響視頻文件的大小。所以如果趕時間而文件大小不是很重要可以設置為ultrafast
- threads:用於ffmpeg的線程數,可以加快多核計算機上視頻輸出的速度
- ffmpeg_params:需要額外傳遞的任何其他ffmpeg參數,使用列表傳遞,形如:[’-option1’,‘value1’,’-option2’,‘value2’]
- write_logfile:如果為True,將為音頻和視頻輸出記錄日志文件。日志文件將以“.log”結尾,包含輸出文件的名稱
- logger:字符串類型,"bar"表示進度條、None 表示不設置、或任何程序日志記錄器的名字
- verbose:已經廢棄使用,留下來是為了兼容性,以前用於打開/關閉消息。現在使用logger=None。
五、音頻的輸出
音頻的輸出調用AudioFileClip的write_audiofile方法,具體語法如下:
write_audiofile(self, filename, fps=None, nbytes=2, buffersize=2000,
codec=None, bitrate=None, ffmpeg_params=None,
write_logfile=False, verbose=True, logger='bar')
相關參數在前面幾個方法中都有。
廣告
老猿關於PyQt的付費專欄《使用PyQt開發圖形界面Python應用》只需要9.9元,本專欄《PyQt+moviepy音視頻剪輯實戰》文檔的同樣內容在付費專欄上也有相應內容,總體來說付費專欄介紹更詳細或案例更多。本節內容對應付費專欄的《moviepy音視頻剪輯:音視頻的加載和輸出》。如果有興趣也願意支持老猿的讀者,歡迎購買付費專欄。