moviepy音视频开发:音频剪辑基类AudioClip
? ? 前往老猿Python博文目錄 ?
一、背景知識介紹
1.1、聲音三要素:
- 音調:人耳對聲音高低的感覺稱為音調(也叫音頻)。音調主要與聲波的頻率有關。聲波的頻率高,則音調也高。
- 音量:也就是響度。人耳對聲音強弱的主觀感覺稱為響度。響度和聲波振動的幅度有關。一般說來,聲波振動幅度越大則響度也越大。
- 音色:也就是音品。音色是人們區別具有同樣響度、同樣音調的兩個聲音之所以不同的特性,或者說是人耳對各種頻率、各種強度的聲波的綜合反應。音色與聲波的振動波形有關,或者說與聲音的頻譜結構有關。
更多關于聲音三要素的內容請參考《音頻基礎知識》。
2.1、數字音頻常用概念
更多關于音頻參數的說明請參考《音頻基礎知識》、《音頻 屬性詳解(涉及采樣率、通道數、位數、比特率、幀等)》。
二、AudioClip簡介
AudioClip是一個音頻剪輯的基類,其父類是Clip。AudioClip帶有make_frame屬性,該屬性根據時間參數t返回一個形如[f_t]或[f_t1,f_t2]的列表,[f_t]、[f_t1,f_t2]分別對應單聲道音頻numpy數組和立體聲音頻numpy數組。這些數組的每個元素都是為-1到1之間的浮點數。
老猿理解AudioClip對應的音頻幀數據是一個列表,這個列表有如下特征:
1、列表的長度等于音頻的通道數,目前僅支持1和2,即單聲道和雙聲道;
2、列表中的元素為-1到1之間的浮點數,其精度與采樣位數相關;
3、列表中元素的大小除了表示音調還表征了音量。
三、構造方法
調用語法:
__init__(self, make_frame=None, duration=None, fps=None)
參數說明:
- make_frame:幀的構建方法,幀的構建方法用于根據時間構建幀,該方法是get_frame獲取幀時調用的方法。幀的構建可以從已有剪輯中獲取或變換,也可以代碼自己填充;
- duration:音頻剪輯的時長
- fps:這里的fps可以理解為音頻的采用率
功能說明:
構造方法用于使用參數同名的實例變量記錄參數傳入的make_frame、duration和fps,如果make_frame非空則會通過make_frame獲取開始位置的音頻幀后獲取音頻的通道數記錄到實例變量nchannels屬性,如果duration非空,則會同時更新實例變量duration和end。
四、iter_chunks方法
iter_chunks方法返回一個迭代器,通過這個迭代器可以返回一個包含音頻剪輯內容塊的數組。
調用語法:
iter_chunks(self, chunksize=None, chunk_duration=None, fps=None,quantize=False, nbytes=2, logger=None)
參數說明:
- chunksize:塊的大小
- chunk_duration:塊包含的音頻時長,其值不為None時,則chunksize=chunk_duration*fps向下取整,如果chunksize有值也被計算值覆蓋
- fps:塊輸出的采樣頻率,如果為None則等于剪輯的fps屬性
- quantize:是否量化處理,如果為True,則將音頻幀對應的音頻數據進行如下處理:
- nbytes:音頻采用位數,缺省值為2字節即16位
- logger:是否開啟日志,字符串類型,"bar"表示進度條、None 表示不設置、或任何程序日志記錄器的名字
返回的迭代器包含的數據塊數=(fps*剪輯的時長)/chunksize+1,這個方法可以在需要對音頻剪輯進行變換處理時使用。
五、to_soundarray方法
to_soundarray方法將音頻片段轉換為一個可以使用pygame播放或者使用wav格式保存的數組。
調用語法:
to_soundarray(self, tt=None, fps=None, quantize=False, nbytes=2, buffersize=50000)
參數說明:
- tt:為時間浮點數或時間浮點數的列表,用于獲取對應時間的音頻數據
- fps:采用頻率,如果為None則等于剪輯的fps屬性
- quantize:是否量化處理,請參見iter_chunks方法參數說明
- nbytes:音頻采用位數,缺省值為2字節即16位
- buffersize:緩沖區大小,從剪輯中轉換時,該大小即為處理塊的大小
返回值為一個音頻數據的np一維數組或二維數組,分別對應tt為時間浮點數或時間浮點數的列表兩種情況。如果quantize為False,返回數組的元素為【-1,1】之間的浮點數,否則為整數(請參見iter_chunks方法參數說明)。
六、max_volume方法
max_volume方法是取音頻剪輯的最大音量,最大音量也就是音頻數組元素絕對值的最大值。
調用語法:max_volume(self, stereo=False, chunksize=50000, logger=None)
說明:
- stereo:是否立體聲,該參數為True且剪輯的聲道數為2才會在處理時作為立體聲處理,否則作為單聲道處理
在老猿的驗證環境下,max_volume存在兩個BUG,詳細的情況請參考《moviepy音視頻剪輯:AudioClip的max_volume方法報TypeError: bad operand type for abs(): ‘list‘錯》、《moviepy AudioClip的max_volume方法報錯ValueError: operands could not be broadcast together with shapes(2,)》的介紹。
七、write_audiofile方法
write_audiofile方法用于將音頻剪輯的內容輸出到指定文件,該方法替換了低版本的to_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')
參數說明:
- filename:文件名,類型包括文件如mp3、wav、ogg、m4a等都可以
- fps:幀率,與音頻采樣率含義相同,每秒編碼的幀數,如果為None且音頻剪輯設置了fps則以剪輯額的fps屬性值作為輸出,否則以缺省值44100輸出
- nbytes:音頻的采用的位數
- buffersize:輸出緩沖區大小,以該大小作為輸出時數據讀取塊的大小
- bitrate:碼率,音頻比特率
- codec:用于音頻編碼的編解碼器,如果沒有指定則系統根據輸出文件名類型來確認。默認值為“libmp3lame”,除非視頻擴展名為“ogv”或“webm”,在這2種情況下,默認值為“libvorbis”。 如果是16位wav音頻設置為 ‘pcm_s16le’、32位wav音頻則設置為 ‘pcm_s32le’
- write_logfile:如果為True,將為音頻輸出記錄日志文件。日志文件將以“.log”結尾,包含輸出文件的名稱
- verbose:已經廢棄使用,留下來是為了兼容性,以前用于打開/關閉消息。現在使用logger=None。
- ffmpeg_params:需額外傳遞的其他ffmpeg參數,用列表傳遞,形如:[’-option1’,‘value1’,’-option2’,‘value2’]
- logger:字符串類型,"bar"表示進度條、None 表示不設置、或任何程序日志記錄器的名字
更多moviepy的介紹請參考《PyQt+moviepy音視頻剪輯實戰文章目錄》或《moviepy音視頻開發專欄》。
關于收費專欄
本文為免費專欄文章,本文對應收費專欄文章《moviepy音視頻開發:音頻剪輯基類AudioClip詳解》。與本文章內容對比,收費專欄部分文章內容介紹更深入或案例更多。
老猿的付費專欄《使用PyQt開發圖形界面Python應用》專門介紹基于Python的PyQt圖形界面開發基礎教程,付費專欄《moviepy音視頻開發專欄》詳細介紹moviepy音視頻剪輯合成處理的類相關方法及使用相關方法進行相關剪輯合成場景的處理,兩個專欄加起來只需要19.9元,都適合有一定Python基礎但無相關專利知識的小白讀者學習。這2個收費專欄都有對應免費專欄,只是收費專欄的文章介紹更具體、內容更深入、案例更多。
對于缺乏Python基礎的同仁,可以通過老猿的免費專欄《專欄:Python基礎教程目錄》從零開始學習Python。
如果有興趣也愿意支持老猿的讀者,歡迎購買付費專欄。
跟老猿學Python、學5G!
? ? 前往老猿Python博文目錄 ?
總結
以上是生活随笔為你收集整理的moviepy音视频开发:音频剪辑基类AudioClip的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ boost
- 下一篇: 古代野兽 Ancient Beast:优