日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android pcm频谱_Android  音乐频谱实现

發布時間:2024/3/26 Android 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android pcm频谱_Android  音乐频谱实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近在做一款音樂播放器,設計人員新設計樣圖時

加了一個音樂頻譜展示界面,如上圖所示。這東西在Window的MediaPlayer中很常見,而且有多種效果。

但不知道怎么實現,我在文檔的開發者指南里沒有講任何有關音樂頻譜的東西,最后還是在google的源碼示例中找到了。

你可以直接去參看源代碼中更多內容。

所有以下所講的功能,均需要在2.3以上的sdk中才能實現。

音頻頻譜的獲取

首先音頻的頻譜相關的類叫做 android.media.audiofx.Visualizer;

需要權限 ,所以要做的第一件事 是初始化一個visualizer出來。

//使用音樂的sessionId來實例化這個類

mVisualizer = new

Visualizer(mMediaPlayer.getAudioSessionId());

//設置每次捕獲頻譜的大小,音樂在播放中的時候采集的數據的大小或者說是采集的精度吧,我的理解,而且getCaptureSizeRange()所返回的數組里面就兩個值

.文檔里說數組[0]是最小值(128),數組[1]是最大值(1024)。

mVisualizer.setCaptureSize(Visualizer.getCaptureSizeRange()[1]);

//接下來就好理解了,設置一個監聽器來監聽不斷而來的所采集的數據。一共有4個參數,第一個是監聽者,第二個單位是毫赫茲,表示的是采集的頻率,第三個是是否采集波形,第四個是是否采集頻率

mVisualizer.setDataCaptureListener(new

Visualizer.OnDataCaptureListener() {

//這個回調應該采集的是波形數據

@Override

public void onWaveFormDataCapture(Visualizer visualizer, byte[]

waveform,

int samplingRate) {

//waveformView 是一個自定義的view用來按照波形來畫圖 一會后面再講

waveformView.updateVisualizer(waveform);

}

//這個回調應該采集的是快速傅里葉變換有關的數據,沒試過,回頭有空了再試試

@Override

public void onFftDataCapture(Visualizer visualizer, byte[]

fft,

int samplingRate) {

// TODO Auto-generated method stub

}

}, Visualizer.getMaxCaptureRate() / 2, true, false);

以上波形的數據采集就完成了,需要注意的一個點是mVisualizer.setEnabled(true);

這個方法的主要作用是為了控制何時去采集頻譜數據,你應該只是愿意采集你所關心的音樂數據,而不關心聲音輸出器中任何的聲音。而且對mVisualizer的許多設置必須在setEnable之前完成,并且結束功能后,要記得setEnable(false)。

如果你見到了以下這個錯誤,那基本上就是因為沒有及時setEnable(false),導致setCaptureSize()這個方法出錯。

E/AndroidRuntime(22259): Caused by:

java.lang.IllegalStateException: setCaptureSize() called in wrong

state: 2

順帶再說一個bug 如果你得到的錯誤代碼是 -1 那么基本上的原因是你忘記了聲明權限

音頻頻譜的展示

上面已經通過監聽器獲得了波形數據,那么如何展示?這僅僅是一個自定義view的問題,簡單廢話一下:重點提一下view中的onDraw()方法:

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

//mBytes就是采集來的數據 這里是個大小為1024的數組,里面的數據都是byts類型,所以大小為-127到128

if (mBytes == null) {

return;

}

if (mPoints == null || mPoints.length < mBytes.length * 4)

{

//mPoints主要用來存儲要畫直線的4個坐標(每個點兩個坐標,所以一條直線需要兩個點,也就是4個坐標)

mPoints = new float[mBytes.length * 4];

}

mRect.set(0, 0, getWidth(), getHeight());

//xOrdinate是x軸的總刻度,因為一次會傳輸過來1024個數據,每兩個數據要畫成一條直線,所以x軸我們分成1023段。你要是覺的太多了,也可以像我一樣除以2,看自己需求了。

int xOrdinate = (mBytes.length - 1)/2;

//以下的for循環將利用mBytes[i] mBytes[i+1]

這兩個數據去生成4個坐標值,從而在刻畫成兩個坐標,來畫線條

for (int i = 0; i

//第i個點在總橫軸上的坐標,

mPoints[i * 4] = mRect.width() * i / xOrdinate;

//第i個點的在總縱軸上的坐標。他在畫線上以總縱軸的1/2為基準線(mRect.height() /

2),所有的點或正或負以此線為基礎標記。

//((byte) (mBytes[i] +

128))這個一直沒有理解,如果+128是為了將數據全部換算為正整數,那么強轉為byte后不又變回-127到128了么??要是誰知道原因可以留言告訴我.....

//(mRect.height() / 2) /

128就是將二分之一的總長度換算成128個刻度,因為我們的數據是byte類型,所以刻畫成128個刻度正好

mPoints[i * 4 + 1] = mRect.height() / 2+ ((byte) (mBytes[i] + 128))

* (mRect.height() / 2) / 128;

//以下就是刻畫第i+1個數據了,原理和刻畫第i個一樣

mPoints[i * 4 + 2] = mRect.width() * (i + 1) / xOrdinate;

mPoints[i * 4 + 3] = mRect.height() / 2 + ((byte) (mBytes[i + 1] +

128)) * (mRect.height() / 2) / 128;

}

//循環結束后,就得到了這一次波形的所有刻畫坐標,直接畫在畫布上就好了

canvas.drawLines(mPoints, mForePaint);

}

參考:

此外,通過還可以通過示波器實現話筒聲音效果:

音樂文件 字符亂碼問題解決

這幾天做 音樂播放器的時候遇到這個問題,在我的Nexus S上 音樂歌曲名獲取沒有問題,但是歌手和

專輯總是顯示亂碼。HTC不會顯示亂碼這個不知道為何呢。。。。。。于是Google之 ,發現這個Android不能解析“gbk

32”編碼的音樂文件。

后來我就 new String( str.getBytes("utf-8"))

就解決了這個問題

總結

以上是生活随笔為你收集整理的android pcm频谱_Android  音乐频谱实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。