當前位置:首頁 » 安卓系統 » android波形圖

android波形圖

發布時間: 2022-10-03 13:51:54

Ⅰ Android OpenGLES3繪圖 - 音頻可視化(模仿MIUI系統效果)

小米手機播放音樂時鎖屏頁面可以設置音頻可視化效果,這是用OpenGL繪制出來的,我們來實現一下。

首先簡單分析一下原理:
圖形的每一行代表一個聲音片段,它就是一個一維數組,按照數值大小繪制不同的高度,就形成了一條「山脈」;獲取到下一個聲音片段後,將它繪制到下面一行,然後畫面整體向上滾動就可以了。整體類似於繪制一張游戲里常見的3D地形圖。

創建一個MediaPlayer,它可以直接讀取res/raw裡面的音頻文件,start()開始播放

Visualizer是Android SDK裡面提供的音頻分析工具,它可以直接獲取播放的音頻的波形和頻譜。onWaveFormDataCapture回調方法里返回的是原始的PCM波形數組,onFftDataCapture回調方法里返回的是經過快速傅里葉方法轉換後的聲音頻譜數組,數組的第一位是直流分量,後面是不同頻率的數值。

每次獲取到的是一組聲音數據,將它傳給Render繪制。

首先確定圖形的長寬,寬度w其實是由每組音頻的數組長度決定,可以由Visualizer.getCaptureSizeRange()[0]獲取,這里獲取的是最小的數組,也可以用Visualizer.getCaptureSizeRange()[1]獲取最大的數組;長度h可以自己設置想展示多長。

繪制地形圖也就是繪制w * h * 2個三角形,創建vao、vbo和ebo,由於頂點的位置都是固定的,可以在頂點著色器中用gl_VertexID獲取,所以vbo裡面不用傳頂點數據,直接傳聲音數組。

由於圖形是不斷刷新最後一行並向上滾動的,那麼需要使用一個隊列,為了每一幀數據改變最小,不至於進行大量的數組復制和移動。我們 用ByteBuffer vertexBuffer模擬一個循環隊列,使用一個行號int lineNum來標記隊列的頭部。每添加一行數據後,lineNum會加上w,這樣ByteBuffer分成了兩部分:lineNum * w之後的是新舊數據,之前的是舊數據

現在我們需要將數據從主內存(vertexBuffer)復制到GPU顯存(vbo)。vertexBuffer里是一個循環隊列,而vbo裡面只能順序保存(因為ebo序號是順序的,vbo不是順序圖形就會錯亂),更新vbo數據緩存的glBufferSubData方法支持設置偏移位置部分更新。那麼我們 先將vertexBuffer定位到lineNum * w,將它後面的舊數據復制到vbo的前面;然後將vertexBuffer定位到0,將剩下的新數據復制到vbo的後面 。這樣就保證了繪制時從上到下,從舊到新。

為了讓顏色更豐富,這里用了地形圖中常用的熱度漸變色數組。
理論上音頻數值是unsigned byte格式的,但是著色器不支持byte格式,我直接用int vPosition接收數據,然而數值范圍不再是0~255了,這有點奇怪,我沒有深入研究。簡單測試了一下,發現取int的前8位,再進行一點比例縮放,用它去漸變色數組里取顏色,會取得較好的顯示效果。

頂點著色器
shader_audio_v.glsl

將顏色傳給片段著色器顯示
shader_audio_f.glsl

最終效果如下圖,錄屏設置的碼率比較低,實際上是很清晰的。

完整項目在 SurfacePaint 項目下的 opengles3 模塊里的audio。

Ⅱ 如何得到一段音樂的波形圖

下載一個美冊,用裡面的可視化音頻功能製作,美冊的可視化音樂做出來以後音樂的波形可以跟著節奏跳動,非常立體,美冊的可視化音樂效果非常多,主題非常多,圓形頻譜和波形頻譜都可以調整


Ⅲ android 繪制心電波形圖

參考網上思路寫的一個 demo,僅供參考
兩個 Bitmap 一個作為橡皮檫在前面每次擦除一段比如 20cm,另外一個 Bitmap 在後面每次畫一小段比如 15cm, 中間留一個間隔。

假如界面上始終顯示 3秒的波形圖,假設每一秒給你 100 個點的數據,那麼我 3秒內要畫 300 個數據點(1秒要畫 100 個點)。
然後根據 view 的寬度就能得到每兩個點的間隔 deltaX, 然後 x軸 從零開始間隔 deltaX 畫一點就行了,畫到頭再從頭循環。

我 1 秒要畫 100 個點,也就是 10毫秒要畫一個點(一個線段)。如果一次畫一個點界面上劃線速度太慢,我們可以一次畫多個點(多條線段),比如我可以每次畫 10 個點,要在 100毫秒內畫完 10 個點(9條線段)。 然後劃線時間可以用定時器控制,每隔100毫秒定時器執行一次繪制,繪制 10 個點的數據(這里忽略繪制時間,假設10個點肯定可在100毫秒內畫完)。

Ⅳ android x86錄音雜音,怎樣更改源碼能夠消除錄音雜音

打開Audition軟體並將需要處理的音頻拖入多軌(即下圖所示軌道)中

雙擊該音頻的波形圖,即可進入編輯界面

選中有噪音的一小段,(選中這段裡面只能有噪音,而不能有人聲),可以通過上滑滾輪來放大界面波形,進行精細操作

單擊上方選項卡效果>修復>降噪器...彈出下圖所示窗口。

點擊「獲取特性」出現下圖波形,再點擊波形全選,並將左側框中參數調為80(可根據噪音大小適當調整,參數越大處理強度越大。)

Ⅳ android 怎麼繪制時時音頻波形圖

安卓開發音頻mic口接收20khz的波形的方法? 一、手機音頻通信的特點 1、 通用性強:在智能手機普及的今天,手機的對外通信介面多種多樣,而其中以3.5mm的音頻介面通用新最強,基本所有的手機、平板電腦都會有這個介面,所以在一些要求通用性的設...

Ⅵ android鈴聲剪輯軟體的波形圖怎麼實現的

首先我先從手機錄制聲音的原理來給你說吧。
我們的話筒並不能直接錄制我們的聲音。而是通過我們的聲音發出的聲波改變了電流量還是電阻忘了的大小,然後我們的手機CPU也就是我們手機的大腦,記錄這個變化的過程,當我們要播放我們的錄音的時候。手機,再把記錄的變化過程還原R鈴聲剪輯中的波形圖,也就是我們的聲波形狀。有些時候我們會看見波形圖,有些時候會高,有些時候會低。

Ⅶ Android畫圖問題求解(如能解決可追加至少200分)

這玩意正事哥哥要做的,等哥哥做完了告訴你 年底見,別家公司的

Ⅷ 如何給Imageview 設置水波紋效果

假設圖片名是[email protected]用[buttonSetBackgroundImage:[UIImageimageNamed:@"myImage"]];就可以了。多少個button公用一張圖片都是可以的,不會出現沖突問題,系統會根據這個圖片生成N個實例對象。

Ⅸ android編程實現心電圖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

class GameView extends SurfaceView implements SurfaceHolder.Callback {
@Override
public void run() {
while (mRun) {
Canvas c = null;
try {
c = mSurfaceHolder.lockCanvas(null);
synchronized (mSurfaceHolder) {
doDraw(c);
}
} finally {
// do this in a finally so that if an exception is thrown
// ring the above, we don't leave the Surface in an
// inconsistent state
if (c != null) {
mSurfaceHolder.unlockCanvasAndPost(c);
}
}
}
}

private void doDraw(Canvas canvas) {
//draw
}
}

熱點內容
ftp伺服器怎麼訪問 發布:2025-01-20 17:08:36 瀏覽:68
一台伺服器多個同段地址怎麼通訊 發布:2025-01-20 16:45:58 瀏覽:734
i7源碼 發布:2025-01-20 16:40:48 瀏覽:983
抽簽源碼 發布:2025-01-20 16:38:35 瀏覽:62
密碼箱怎麼鎖住 發布:2025-01-20 16:32:17 瀏覽:31
編譯隔離 發布:2025-01-20 16:28:54 瀏覽:358
從哪裡看自己的qq賬號和密碼 發布:2025-01-20 16:22:33 瀏覽:400
sql語句動態 發布:2025-01-20 16:18:22 瀏覽:298
sql表或的語句 發布:2025-01-20 16:00:49 瀏覽:163
西瓜視頻怎麼緩存不了電影了 發布:2025-01-20 16:00:45 瀏覽:890