,使得讀取的原始的音頻數(shù)據(jù)的幀數(shù)等于編碼的原始的音頻數(shù)據(jù),可減少原始的音頻數(shù)據(jù)的丟失。在其它的實(shí)施例中,也可從第一緩沖區(qū)中取出部分的原始的音頻數(shù)據(jù)進(jìn)行編碼成預(yù)設(shè)格式,可在該部分的原始的音頻數(shù)據(jù)編碼完成后,繼續(xù)取出部分的原始的音頻數(shù)據(jù)進(jìn)行編碼成預(yù)設(shè)格式。
[0064]步驟S140,將轉(zhuǎn)換成預(yù)設(shè)格式的音頻數(shù)據(jù)寫入預(yù)設(shè)格式文件中。
[0065]具體的,預(yù)設(shè)格式可為MP3、WAV、AAC(Advanced Aud1 Coding,高級音頻編碼)、AMR (Adaptive Mult1-Rate,自適應(yīng)多速率)等音頻格式中的一種,其中,MP3格式是大眾最常用的音頻格式,壓縮率較高且音質(zhì)較好;WAV格式一般用于保存Windows平臺的音頻信息資源,音質(zhì)高,但是壓縮率較小,文件比較大;AAC格式擁有更佳的音質(zhì),采用有損壓縮,且壓縮率高,文件小,但支持該格式的操作系統(tǒng)較少,例如1 S (蘋果公司的移動操作系統(tǒng))、Andro id (安卓)SDK (Software Development Kit,軟件開發(fā)包)4.I.2 以上等支持播放;AMR格式的壓縮率較高,但其相對于其它音頻格式音質(zhì)較差,多用于人聲、通話等錄音數(shù)據(jù)的格式保存。在將原始的音頻數(shù)據(jù)編碼成預(yù)設(shè)格式的同時,讀取線程一直在讀取原始的音頻數(shù)據(jù)并添加入第一緩沖區(qū),當(dāng)?shù)谝痪彌_區(qū)的原始的音頻數(shù)據(jù)又達(dá)到預(yù)設(shè)幀數(shù)時,再一次調(diào)用編碼線程取出第一緩沖區(qū)中全部的原始的音頻數(shù)據(jù)進(jìn)行編碼成預(yù)設(shè)格式,并將轉(zhuǎn)換成預(yù)設(shè)格式的音頻數(shù)據(jù)寫入預(yù)設(shè)格式文件中,直至無原始的音頻數(shù)據(jù)可讀取為止。
[0066]上述音頻格式轉(zhuǎn)換方法,只有當(dāng)?shù)谝痪彌_區(qū)的數(shù)據(jù)達(dá)到預(yù)設(shè)幀數(shù)時才進(jìn)行音頻數(shù)據(jù)的格式轉(zhuǎn)換,由音頻數(shù)據(jù)來通知進(jìn)行轉(zhuǎn)碼工作,編碼線程無需不斷循環(huán)查看是否有數(shù)據(jù)需要進(jìn)行處理,能大大地減少系統(tǒng)消耗。
[0067]在一個實(shí)施例中,在步驟讀取原始的音頻數(shù)據(jù)并將原始的音頻數(shù)據(jù)添加到第一緩沖區(qū)之前,還包括以下步驟:
[0068](I)通過音頻設(shè)備采集聲音信息。
[0069]具體的,音頻設(shè)備可為麥克風(fēng)、播放器等設(shè)備,聲音信息可包括人聲、背景聲、伴唱等,可通過麥克風(fēng)采集人聲,播放器采集伴唱等聲音信息。
[0070](2)對該聲音信息進(jìn)行處理得到原始的音頻數(shù)據(jù)。
[0071]具體的,將通過不同的音頻設(shè)備采集得到的人聲、伴唱等聲音信息進(jìn)行融和處理,例如進(jìn)行去噪、混音等處理,并得到原始的音頻數(shù)據(jù)臨時存入第二緩沖區(qū)中。本實(shí)例中,可實(shí)現(xiàn)邊采集聲音信息邊進(jìn)行音頻格式轉(zhuǎn)換,即當(dāng)開始采集聲音信息時,開始調(diào)用讀取線程從第二緩沖區(qū)中讀取原始的音頻數(shù)據(jù),當(dāng)音頻設(shè)備暫停采集聲音信息時,讀取線程才不再繼續(xù)工作。邊采集聲音信息邊進(jìn)行音頻格式轉(zhuǎn)換,可減少音頻格式轉(zhuǎn)換所需的等待時間。
[0072]在一個實(shí)施例中,步驟對該聲音信息進(jìn)行處理得到原始的音頻數(shù)據(jù),可包括以下步驟:
[0073](I)將伴唱數(shù)據(jù)轉(zhuǎn)化為與人聲數(shù)據(jù)相同的音頻格式。
[0074]具體的,通過麥克風(fēng)采集到的人聲數(shù)據(jù)一般可輸出為最原始的PCM(PulseCodeModulat1n,脈碼調(diào)制錄音)語音格式,可對伴唱數(shù)據(jù)進(jìn)行解碼,并把伴唱數(shù)據(jù)格式轉(zhuǎn)換成與人聲數(shù)據(jù)相同的PCM語音格式,即可進(jìn)行混音操作。這里的伴唱數(shù)據(jù)可以是指音頻文件等數(shù)據(jù)內(nèi)容,在伴唱數(shù)據(jù)為音頻文件的情況下,在進(jìn)行格式轉(zhuǎn)換時,可以通過FFmpeg(—個開源免費(fèi)跨平臺的視頻和音頻流方案)進(jìn)行解碼進(jìn)行播放的同時使用FFmpeg返回PCM語音格式。
[0075](2)讀取相同大小的人聲數(shù)據(jù)及伴唱數(shù)據(jù)進(jìn)行混音操作。
[0076]具體的,可先設(shè)置人聲緩沖區(qū)及伴唱緩沖區(qū),然后將通過不同的音頻設(shè)備采集到的人聲數(shù)據(jù)及轉(zhuǎn)化格式后的伴唱數(shù)據(jù)分別存儲在人聲緩沖區(qū)中及伴唱緩沖區(qū)中。每次可讀取相同樣本大小的人聲數(shù)據(jù)及伴唱數(shù)據(jù)進(jìn)行混音操作,可保證獲取的人聲數(shù)據(jù)及伴唱數(shù)據(jù)基本同步。因人聲數(shù)據(jù)與伴唱數(shù)據(jù)的語音格式一致,均為PCM語音格式,故在進(jìn)行混音操作時,可將讀取的人聲數(shù)據(jù)及伴唱數(shù)據(jù)進(jìn)行疊加,并對疊加后的數(shù)據(jù)進(jìn)行修復(fù),保證進(jìn)行混音操作后得到的原始的音頻數(shù)據(jù)的音質(zhì)效果。
[0077]人聲數(shù)據(jù)與伴唱數(shù)據(jù)的樣本大小是固定的,例如可為shortie位字節(jié),在進(jìn)行疊加后,數(shù)據(jù)容易溢出,因此,在本發(fā)明實(shí)施例方案中,可拓寬樣本大小,例如直接拓寬為int32字節(jié),即上述樣本大小為int32字節(jié),保證疊加后的數(shù)據(jù)大小不會溢出。
[0078]此外,在本發(fā)明實(shí)施例方案中,還可設(shè)置衰減因子,通過衰減因子來將疊加后得到的數(shù)據(jù)的落回16位所能表示的范圍內(nèi),衰減因子的設(shè)置,可以降低疊加后的數(shù)據(jù)的振幅大小,使疊加后的數(shù)據(jù)能落回16位所能表示的范圍內(nèi)。當(dāng)人聲數(shù)據(jù)及伴唱數(shù)據(jù)疊加后的數(shù)據(jù)大小溢出時,衰減因子較小,可使得溢出的數(shù)據(jù)在衰減后能夠處于臨界值以內(nèi),而在疊加后的數(shù)據(jù)大小沒有溢出時,可讓衰減因子慢慢增大,使數(shù)據(jù)較為平緩的變化。人聲數(shù)據(jù)及伴唱數(shù)據(jù)進(jìn)行混音操作完成后即獲得原始的音頻數(shù)據(jù),可將原始的音頻數(shù)據(jù)存入第二緩沖區(qū)中,并進(jìn)行后續(xù)的格式轉(zhuǎn)換操作。
[0079](3)將原始的音頻數(shù)據(jù)存入第二緩沖區(qū)。
[0080]在進(jìn)一步的實(shí)施例中,在步驟通過音頻設(shè)備采集聲音信息之前,還可包括步驟:初始化音頻信息對象。
[0081]具體的,音頻信息對象可包括輸入采樣頻率、輸出采樣頻率、輸入采樣位數(shù)、聲道數(shù)、音頻質(zhì)量等中的一種或多種??筛鶕?jù)實(shí)際需求,預(yù)先初始化設(shè)置上述音頻信息對象,方便后續(xù)音頻數(shù)據(jù)的格式轉(zhuǎn)換及進(jìn)行音頻文件保存。
[0082]在一個實(shí)施例中,上述音頻格式轉(zhuǎn)換方法還包括步驟:同步計(jì)算原始的音頻數(shù)據(jù)的音量大小。
[0083]具體的,原始的音頻數(shù)據(jù)的音量大小可根據(jù)輸入采樣頻率、輸入采樣位數(shù)、聲道數(shù)等音頻信息進(jìn)行計(jì)算,可預(yù)先設(shè)置計(jì)算公式,例如采用數(shù)據(jù)量(字節(jié)/秒)=(輸入采樣頻率(Hz,赫茲)*輸入采樣位數(shù)(Mt,比特)*輸入聲道數(shù))/8的公式進(jìn)行計(jì)算,其中單聲道的聲道數(shù)為I,立體聲的聲道數(shù)為2。在其它的實(shí)施例中,也可使用其它的音量計(jì)算公式進(jìn)行計(jì)算。
[0084]上述音頻格式轉(zhuǎn)換方法,只有當(dāng)?shù)谝痪彌_區(qū)的數(shù)據(jù)達(dá)到預(yù)設(shè)幀數(shù)時才進(jìn)行音頻數(shù)據(jù)的格式轉(zhuǎn)換,由音頻數(shù)據(jù)來通知進(jìn)行轉(zhuǎn)碼工作,編碼線程無需不斷循環(huán)查看是否有數(shù)據(jù)需要進(jìn)行處理,能大大地減少系統(tǒng)消耗。
[0085]如圖2所示,在一個實(shí)施例中,上述音頻格式轉(zhuǎn)換方法還包括以下步驟:
[0086]步驟S210,當(dāng)音頻設(shè)備停止采集聲音信息時,將原始的音頻數(shù)據(jù)的結(jié)尾信息寫入第一緩沖區(qū)。
[0087]具體的,當(dāng)音頻設(shè)備停止采集聲音信息時,則讀取線程停止從第二緩沖區(qū)中讀取原始的音頻數(shù)據(jù),并將原始的音頻數(shù)據(jù)的結(jié)尾信息寫入第一緩沖區(qū)。結(jié)尾信息可包括原始的音頻數(shù)據(jù)的總數(shù)據(jù)幀數(shù)、音頻時間、聲道數(shù)、音頻質(zhì)量等信息中的一種或多種。
[0088]步驟S220,將原始的音頻數(shù)據(jù)的結(jié)尾信息編碼成預(yù)設(shè)格式。
[0089]具體的,編碼線程將該原始的音頻數(shù)據(jù)的結(jié)尾信息編碼成預(yù)設(shè)格式,并寫入預(yù)設(shè)格式文件中,即表示完成音頻數(shù)據(jù)的格式轉(zhuǎn)換工作。
[0090]步驟S230,將編碼成預(yù)設(shè)格式的結(jié)尾信息寫入預(yù)設(shè)格式文件中。
[0091]上述音頻格式轉(zhuǎn)換方法,只有當(dāng)?shù)谝痪彌_區(qū)的數(shù)據(jù)達(dá)到預(yù)設(shè)幀數(shù)時才進(jìn)行音頻數(shù)據(jù)的格式轉(zhuǎn)換,由音頻數(shù)據(jù)來通知進(jìn)行轉(zhuǎn)碼工作,編碼線程無需不斷循環(huán)查看是否有數(shù)據(jù)需要進(jìn)行處理,能大大地減少系統(tǒng)消耗。
[0092]如圖3所示,在一個實(shí)施例中,一種音頻格式轉(zhuǎn)換方法,原始的音頻數(shù)據(jù)可為原始的錄音數(shù)據(jù),預(yù)設(shè)格式可為MP3,包括以下步驟:
[0093]步驟S310,調(diào)用讀取線程讀取原始的錄音數(shù)據(jù)并將原始的錄音數(shù)據(jù)添加到第一緩沖區(qū)。
[0094]具體的,可調(diào)用讀取線程從第二緩沖區(qū)中讀取原始的錄音數(shù)據(jù),其中,可通過音頻設(shè)備采集聲音信息并進(jìn)行處理獲得原始的錄音數(shù)據(jù),并臨時存儲在第二緩沖區(qū)中。
[0095]步驟S320,判斷第一緩沖區(qū)中的原始的錄音數(shù)據(jù)是否達(dá)到預(yù)設(shè)幀數(shù),若是,則執(zhí)行步驟S330,若否,則執(zhí)行步驟S310。
[0096]具體的,當(dāng)讀取的原始的錄音數(shù)據(jù)的數(shù)據(jù)包達(dá)到預(yù)設(shè)幀數(shù),即第一緩沖區(qū)中原始的錄音數(shù)據(jù)達(dá)到預(yù)設(shè)幀數(shù)時,立即調(diào)用編碼線程進(jìn)行編碼成MP3格式,由讀取線程來通知編碼線程進(jìn)行工作。
[0097]步驟S330,調(diào)用編碼線程從第一緩沖區(qū)中取出預(yù)設(shè)幀數(shù)的原始的錄音數(shù)據(jù)編碼成MP3格式。
[0098]具體的,可從第一緩沖區(qū)中取出預(yù)設(shè)幀數(shù)的原始的錄音數(shù)據(jù),即取出第一緩沖區(qū)全部的原始的錄音數(shù)據(jù)編碼成MP3格式,使得讀取的原始的錄音數(shù)據(jù)的幀數(shù)等于編碼的原始的錄音數(shù)據(jù),可減少原始的錄音數(shù)據(jù)的丟失。編碼成MP3格式后,可將轉(zhuǎn)換成MP3格式的錄音數(shù)據(jù)寫入MP3文件中。
[0099]步驟S340,將轉(zhuǎn)換成MP3格式的錄音數(shù)據(jù)寫入MP3文件中。
[0100]上述音頻格式轉(zhuǎn)換方法,只有當(dāng)?shù)谝痪彌_區(qū)的數(shù)據(jù)達(dá)到預(yù)設(shè)幀數(shù)時才將第一緩沖區(qū)中的原始的錄音數(shù)據(jù)編碼成MP3格式,由讀取線程來通知編碼線程進(jìn)行轉(zhuǎn)碼工作,編碼線程無需不斷循環(huán)查