前言
一直對于音樂可視化非常感興趣,正好工作中涉及到這一塊,所以整理一下歼郭,用Android實現(xiàn)一個簡單音樂可視化的播放器。
基礎(chǔ)知識
1辐棒、音量
人主觀上感覺到的聲音大胁≡(也叫響度),由“振幅”(amplitude)和人離聲源的距離決定漾根。
2泰涂、音調(diào)
聲音的高低(高音、低音)辐怕,由“頻率”(frequency)決定逼蒙,頻率越高音調(diào)越高。
3寄疏、音色
音色是一種抽象的東西是牢,波形決定了聲音的音色僵井。聲音因不同發(fā)聲物體材料而具有不同特性,波形是把這個抽象特性直觀的表現(xiàn)出來驳棱。典型的音色波形有方波批什,鋸齒波,正弦波社搅,脈沖波等驻债。
4、采樣
所謂采樣形葬,即按一定的采樣頻率將模擬信號變成時間軸上離散的抽樣信號的過程合呐。原則上采樣頻率越高,聲音的質(zhì)量也就越好笙以,聲音的還原也就越真實淌实。
采樣率即每秒從模擬信號中提取并組成離散信號的采樣個數(shù),用赫茲(Hz)來表示源织。說到采樣率有一個不得不提的著名定律翩伪,即香農(nóng)(Shannon)/奈奎斯特(Nyquist)采樣定律,該定律表明采樣頻率必須大于或等于所傳輸?shù)哪M信號的最高頻率的2倍谈息,才能不失真地恢復(fù)模擬信號。
5凛剥、 量化
前面采樣得到的抽樣信號雖然是時間軸上離散的信號侠仇,但仍然是模擬信號,其采樣值在一定的取值范圍內(nèi)犁珠,可有無限多個值逻炊,必須采用“四舍五入”的方法把樣值分級“取整”,使一定取值范圍內(nèi)的樣值由無限多個值變?yōu)橛邢迋€值犁享,這一過程稱為量化余素。
6、編碼
量化后的抽樣信號就轉(zhuǎn)化為按抽樣時序排列的一串十進制數(shù)字碼流炊昆,即十進制數(shù)字信號桨吊。簡單高效的數(shù)據(jù)系統(tǒng)是二進制碼系統(tǒng),因此凤巨,應(yīng)將十進制數(shù)字碼變換成二進制編碼视乐,這種把量化的抽樣信號變換成給定字長(量化位數(shù))的二進制碼流的過程稱為編碼。
編碼方式種類非常多敢茁,其對比可見 Comparison of audio coding formats佑淀,PCM音頻格式編碼常見有四種:PCM(Linear PCM)、ADPCM(Adaptive differential PCM)彰檬、 A-law(A律13折線碼)伸刃、μ-law(μ律15折線碼)谎砾,最簡單的當然是下圖所示的LPCM(示例為4bit),這是一種均勻量化編碼捧颅,廣泛用于 Audio CD, AES3, WAV, AIFF, AU, M2TS, VOB中景图。
模擬信號到數(shù)字信號的過程
同過上面的圖可以看出隘道,模擬信號通過pam后生成采樣信號症歇,然后通過量化生成了-127到+127之間的數(shù)據(jù),最后通過二進制存放谭梗。
Visualizer
有了上面的基礎(chǔ)知識忘晤,可以知道音樂可視化其實可以通過量化后的數(shù)據(jù)去生成音樂的可視化內(nèi)容,google官方提供了Visualizer類來幫助實現(xiàn)音樂可視化激捏,這個類主要是可以返回音樂的Waveform data和Frequency data
1设塔、Waveform data
waveform data 波形數(shù)據(jù),就是上面圖中模擬信號經(jīng)過處理后的數(shù)據(jù)远舅,google提供的是一個8bit的無符號數(shù)據(jù)闰蛔。
2、Frequency data
Frequency data 就是頻率數(shù)據(jù)图柏,頻率數(shù)據(jù)是通過快速傅里葉轉(zhuǎn)換序六,把時域上連續(xù)的信號(波形)強度轉(zhuǎn)換成離散的頻域信號(頻譜)
Visualizer使用
1、獲取實例
visualizer = new Visualizer(mediaPlayer.getAudioSessionId());
2蚤吹、設(shè)置采樣值
visualizer.setCaptureSize(Visualizer.getCaptureSizeRange()[1]);
通過Visualizer.getCaptureSizeRange()這一底層實現(xiàn)的方法來返回一個采樣值的范圍數(shù)組例诀,0為最小值128,1為最大值1024!采樣值都為2的n次冪裁着!
3繁涂、設(shè)置監(jiān)聽器
setDataCaptureListener(OnDataCaptureListener listener, rate,iswave,isfft )
先說后面三個參數(shù):rate采樣的頻率,下邊通過方法Visualizer.getMaxCaptureRate()返回最大的采樣頻率二驰,單位為milliHertz毫赫茲扔罪,iswave是波形信號,isfft是頻域信號桶雀。
第一個參數(shù)OnDataCaptureListener接口矿酵,這里可以一個它的匿名內(nèi)部類,然后它有兩個回調(diào)方法:
onWaveFormDataCapture(Visualizer visualizer, byte[] waveform, int samplingRate)
和
onFftDataCapture(Visualizer visualizer, byte[] fft, int samplingRate)
這兩個回調(diào)對應(yīng)著上邊的兩個參數(shù)iswave和isfft背犯!如果iswave為true坏瘩,isfft為false則會回調(diào)onWaveFormDataCapture方法,如果iswave為false漠魏,isfft為true則會回調(diào)onFftDataCapture方法倔矾。
音樂可視化實現(xiàn)
代碼實現(xiàn)
未完待續(xù)....
項目地址
https://github.com/hankinghu/AudioVisulizer
參考
1、https://developer.android.com/reference/android/media/audiofx/Visualizer