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