2012-02-28 117 views
7

我希望在未來的C#.NET 4.0中使用一些音頻項目,所以我收集了一些音頻錄製代碼示例,WAVE文件等工作。但是我沒有什麼無法找到的是:實時圖形繪製(波形)

如何實時繪製音頻波形/光譜圖(ish)?顯然,創建一個內存中的位圖並將其加載到圖片框中會很慢,對吧?那麼,最簡​​單的方法是什麼?

謝謝!

+0

看起來像一個重複的問題 - 退房:http://stackoverflow.com/questions/5606367/how-to-create- sound-spectrogram-in-c(C#,儘管鏈接) – holtavolt 2012-02-28 17:32:04

+1

對於實時波形顯示,您可能需要查看硬件加速圖形 - 我認爲可憐的舊GDI +能夠很好地應對。我認爲最好的做法是簡單地將包含音頻數據的環形緩衝區直接發送到顯卡,以便由着色器渲染爲紋理。你甚至可以在着色器中做FFT,如果你想:) – MattDavey 2012-02-28 17:37:09

+0

我很想知道這個答案。論壇傳言稱Direct2D是最快的.NET屏幕繪畫API,但我從未見過使用它的WinForms應用程序。你必須使用WinForms? – 2012-02-28 17:41:16

回答

1

您可以使用基於GDI +的Graphics and Drawing in Windows Forms直接繪製您的內容。這將比渲染到位圖並在圖片框中顯示不斷變化的內容快得多。

+0

對於光譜圖,我必須畫出基本相當於位圖的內容。 GDI +處理得好嗎? – John 2012-02-28 17:49:53

+0

@John相對來說 - 它將比繪製位圖和渲染更快。 – 2012-02-28 17:56:43

+0

我不同意。繪製屏幕控制比繪製位圖並更改它慢。我用秒錶嘗試過。 5K線。以下是結果: 屏幕控制:2772ms 位圖&更改:85ms 雙緩衝屏幕控制:2657ms – Onur 2012-02-28 18:12:51

1

只需在合適的控制面即面板上直接塗漆即可。獲取控件的圖形上下文,並使用Invalidate()函數在Paint-event中更新它。每次無效時,Paint都會自動調用。這是你想要放置繪圖邏輯的地方。

更新它的最好方法是使用DrawImageUnscaled()。本身是最快與LockBits方法制造的形象,出色地解釋這裏:

http://www.bobpowell.net/lockingbits.htm