徐 晉
(中國船舶集團(tuán)第七一五研究所,浙江 杭州 310000)
在研究水聲目標(biāo)時(shí),由于研究人員不知道什么時(shí)間會(huì)出現(xiàn)特征音頻,所以就會(huì)對整個(gè)實(shí)驗(yàn)進(jìn)行全程錄音;這就會(huì)出現(xiàn)錄音時(shí)長較長且錄音文件較大的問題,為后續(xù)對目標(biāo)音頻的特征分析帶來困難。為了解決該問題,研究人員可以使用音頻編輯軟件對感興趣的音頻進(jìn)行裁剪后再做分析?,F(xiàn)在市面上已經(jīng)有了許多非常優(yōu)秀的商業(yè)音頻編輯軟件,例如Cool Edit等。但是由于軟件版權(quán)和系統(tǒng)環(huán)境的限制,就導(dǎo)致了在某些特定場景下無法使用該類軟件。通過運(yùn)用Qt的跨平臺(tái)特性,可以開發(fā)1款擁有自主知識(shí)產(chǎn)權(quán)的跨平臺(tái)音頻編輯軟件。該文主要討論了如何開發(fā)1款基于Qt的WAV音頻剪切軟件,從而解決前文中所提到的問題。
該軟件使用Qt Creator平臺(tái)進(jìn)行開發(fā)。Qt Creator是Qt推出的1款輕量級集成開發(fā)環(huán)境,它包括項(xiàng)目生成向?qū)А⒏呒壍腃++代碼編輯器、瀏覽文件及類的工具、集成了Qt Designer、Qt Assistant、Qt Linguist、圖形化的 GDB 調(diào)試前端,集成 qmake構(gòu)建工具等。Qt Creator具有跨平臺(tái)的特性,其開發(fā)的軟件可以在Windows、Linux、VxWork以及移動(dòng)平臺(tái)上部署[1]。
WAV音頻裁剪軟件的功能模塊主要分為波形顯示模塊、播放控制模塊、音頻剪切模塊以及音頻錄制模塊。
波形顯示模塊主要具備繪制音頻文件的時(shí)域幅度圖像、繪制時(shí)長坐標(biāo)、管理水平Slider的樣式以及操作控制等功能。
播放控制模塊主要具備載入音頻文件、控制音頻文件的播放以及控制媒體音量等功能。
音頻裁剪模塊實(shí)現(xiàn)了對剪切音頻文件的靜態(tài)參數(shù),該函數(shù)的4個(gè)參數(shù)分別是待裁剪文件的絕對路徑、裁剪后文件的保存路徑、舍棄前段音頻文件時(shí)長以及舍棄的后端音頻文件時(shí)長。
音頻錄制模塊主要具備音頻錄制以及控制音頻錄制的功能。最后將各個(gè)模塊整合成音頻剪切軟件,打通功能模塊之間的接口并調(diào)用,從而實(shí)現(xiàn)功能菜單欄。
WAV為微軟公司開發(fā)的1種聲音文件格式,它符合RIFF文件的規(guī)范,可以用來保存Windows平臺(tái)的音頻信息資源,廣泛應(yīng)用于Windows平臺(tái)及其應(yīng)用程序。WAV文件通常使用聲道數(shù)、采樣頻率和采樣位數(shù)來表示聲音。采樣位數(shù)分為8位、16位和24位;聲道分為單聲道和立體聲,單聲道振幅數(shù)據(jù)為n×1的矩陣點(diǎn),立體聲為n×2的矩陣點(diǎn),采樣頻率一般有11025 Hz(11 kHz)、22050 Hz(22 kHz)和44100 Hz(44 kHz)3種[2]。WAV文件的基本格式見表1。
表1 WAV文件的基本格式
通過解析WAV文件可以獲取各個(gè)時(shí)刻的音頻振幅信息,也可以按照其格式編輯WAV文件,從而達(dá)到剪切的效果。
2.2.1 時(shí)域幅度圖像繪制
自定義1個(gè)基于QWiget的波形顯示類WaveDisplay,重載其PainEvent()函數(shù)。在PainEvent()函數(shù)中調(diào)用QPainter的drawLine()函數(shù)繪制時(shí)域幅度圖像,幅度數(shù)據(jù)可以通過對WAV文件數(shù)據(jù)塊解析的方式獲得。根據(jù)WAV文件聲道數(shù)的不同,采用不同的繪制方式。為了支持波形圖像的縮放功能,在繪制時(shí)需要代入圖像的尺寸信息,關(guān)鍵代碼如下。
2.2.2 時(shí)長坐標(biāo)繪制
通過調(diào)用播放控制模塊的預(yù)留接口, 可以將WAV文件的時(shí)長信息精確到毫秒。繪制時(shí)長坐標(biāo)分為繪制文字和繪制標(biāo)尺線;使用QPainter的drawText()函數(shù)繪制文字,由于文字顯示的“xx:xx:xx:xxx”字符串較長,如果要讓字符在首部與尾部完整的顯示,就需要進(jìn)行左右搬移,這就會(huì)導(dǎo)致字符串之間的間隔不統(tǒng)一,因此在首部與尾部不繪制文字。使用QPainter的drawLine()函數(shù)繪制標(biāo)尺線,標(biāo)尺分為長橫線和短豎線;為了適應(yīng)縮放,長橫線與時(shí)域幅度圖像等寬;短豎線每繪制若干格就標(biāo)注1個(gè)刻度信息。需要注意的是,每一格坐標(biāo)的長度會(huì)隨著縮放比例的變化而變化,如果單格長度過長就會(huì)顯得坐標(biāo)不夠美觀;因此,時(shí)長坐標(biāo)格數(shù)應(yīng)該隨著縮放比例的變化而變化。在該軟件中,當(dāng)縮放比例小于5倍時(shí),2個(gè)標(biāo)注之間繪制5格;當(dāng)縮放比例大于5倍時(shí),2個(gè)標(biāo)注之間繪制10格。
2.2.3 水平Slider的樣式管理
使用Qt自帶的QSlider來實(shí)現(xiàn)用水平Slider去表示當(dāng)前顯示的幅度波形在全局幅度波形中的位置。QSlider總長度表示W(wǎng)AV文件的全長,滑塊長度表示當(dāng)前可視范圍內(nèi)的時(shí)長。通過設(shè)置QSlider的樣式表,可以控制滑塊的長度;調(diào)用QSlider的SetValue()函數(shù)可以設(shè)定滑塊的位置。
2.2.4 操作控制
按住鼠標(biāo)左鍵拖拽可以實(shí)現(xiàn)選中的操作。需要重載鼠標(biāo)按下事件(mousePressEvent)、鼠標(biāo)移動(dòng)事件(mouseMoveEvent)以及鼠標(biāo)松開事件(mouseReleaseEvent)。按下鼠標(biāo)左鍵時(shí)記錄按下點(diǎn)的位置坐標(biāo),拖拽時(shí)記錄下最新的位置坐標(biāo),松開鼠標(biāo)左鍵視為完成拖拽操作,根據(jù)起始點(diǎn)與結(jié)束點(diǎn)生成選中區(qū)域。
調(diào)用setContextMenuPolicy(Qt::ActionsContextMenu)函數(shù)設(shè)置菜單按照默認(rèn)方式彈出即右鍵彈出。在有選中區(qū)域的情況下單擊鼠標(biāo)右鍵,再單擊另存為按鈕就可以調(diào)用音頻裁剪模塊對選中區(qū)域進(jìn)行裁剪。
重載波形顯示模塊的鼠標(biāo)滾輪事件(wheelEvent)可以實(shí)現(xiàn)對鼠標(biāo)滾輪的操作。滾動(dòng)滾輪調(diào)整可視窗口的前后位置;按住Ctrl鍵時(shí),滾動(dòng)滾輪調(diào)整縮放比例,縮放比例最小為1.0即不做縮放。
Qt為音視頻的播放和控制、相機(jī)拍攝以及收音機(jī)等多媒體應(yīng)用提供了強(qiáng)大的支持。Qt5使用了全新的Qt Multimedia模塊來實(shí)現(xiàn)多媒體的功能,Qt4中用來實(shí)現(xiàn)多媒體功能的Phonon模塊已經(jīng)被移除。該軟件使用Qt Multimedia模塊中的QMediaPlayer類來實(shí)現(xiàn)音頻的播放。QMediaPlayer類提供了一些接口函數(shù)來控制音頻播放,例如paly()、pause()以及stop()等。
播放控制模塊包括界面上的控制按鈕、播放進(jìn)度條以及音量條與時(shí)間信息的顯示。
新建類型為QMediaPlayer的指針,使用SetMedia()函數(shù)為其設(shè)置待播放的WAV文件。讀取WAV 的時(shí)長信息,并使用該信息繪制時(shí)長坐標(biāo)與設(shè)置進(jìn)度條。調(diào)用play()函數(shù)開始播放WAV文件。建立1個(gè)執(zhí)行周期為50 ms的計(jì)時(shí)器,每當(dāng)計(jì)時(shí)器完成1輪計(jì)時(shí)就可以獲取播放進(jìn)度,并使用播放進(jìn)度在波形顯示模塊繪制進(jìn)度標(biāo)識(shí)線以及更新播放時(shí)間的信息。根據(jù)播放的情況對播放按鈕設(shè)置不同的圖標(biāo)。
音量控制使用SetVolume()函數(shù),設(shè)定范圍在0音量~100音量之間,0表示靜音;根據(jù)靜音的情況為音量按鈕設(shè)置不同的圖標(biāo)。
音頻裁剪模塊通過1個(gè)靜態(tài)函數(shù)來實(shí)現(xiàn),靜態(tài)函數(shù)實(shí)際上是1個(gè)全局函數(shù),不依賴1個(gè)類的對象,不創(chuàng)建對象也可以調(diào)用。靜態(tài)函數(shù)只能訪問類中靜態(tài)成員的變量。函數(shù)的4個(gè)輸入?yún)?shù)分別為待裁剪文件的絕對路徑、裁剪后文件的保存路徑、舍棄前段音頻文件的時(shí)長以及舍棄后段音頻文件的時(shí)長。函數(shù)中應(yīng)當(dāng)添加前后裁剪長度總和不得超過文件總長度的判斷條件。
使用fopen()函數(shù)讀取待剪裁WAV文件,并將WAV文件的RIFF頭、數(shù)據(jù)類型標(biāo)識(shí)符以及格式塊等信息存入本地定義的結(jié)構(gòu)。計(jì)算前后裁剪量后就可以得到裁剪后文件的大小。將裁剪后的文件大小填入之前保存的WAV文件的RIFF頭與格式塊,使用fwrite()函數(shù)將修改后的WAV文件的RIFF頭與格式塊寫入新的WAV文件,最后寫入裁剪后的數(shù)據(jù);具體實(shí)現(xiàn)代碼如下。
QAudioInput類提供了1個(gè)接口,用于從音頻輸入設(shè)備中接收音頻數(shù)據(jù)。可以使用系統(tǒng)默認(rèn)的音頻輸入設(shè)備來構(gòu)建音頻輸入;也可以使用特定的QAudioDeviceInfo創(chuàng)建QAudioInput。創(chuàng)建音頻輸入時(shí),還應(yīng)該設(shè)定QAudioFormat用于確定錄制音頻的聲道數(shù)、采樣率以及采樣位數(shù)等參數(shù)。調(diào)用QAudioInput類的start()函數(shù)開始錄制,調(diào)用stop()函數(shù)結(jié)束錄制,并生成.raw格式的原始音頻文件。為.raw文件添加WAV的RIFF頭、數(shù)據(jù)類型標(biāo)識(shí)符和格式塊,再另存為.wav格式就能得到WAV格式的錄音文件。格式塊中的聲道數(shù)、采樣率以及采樣位數(shù)等參數(shù)信息應(yīng)當(dāng)按照錄音文件的特征填寫。
通過該文所論述的方法,可以開發(fā)1款基于Qt的WAV音頻剪切軟件。該軟件主要用于解決研究人員在研究過程中遇到的WAV音頻文件過大和時(shí)長過長等問題。該軟件利用了Qt的跨平臺(tái)特性,可以在多種平臺(tái)上運(yùn)行。開發(fā)該軟件的最初目的就是為了解決研究人員現(xiàn)階段所遇到的問題,因此難免存在適應(yīng)性窄以及界面不夠美觀等問題,未來可以繼續(xù)對該軟件進(jìn)行迭代優(yōu)化,添加更多功能,例如支持多種音頻文件格式、添加一系列降噪濾波算法、音頻的插入以及編輯等。