2014-10-30 206 views
5

我想從原始音頻文件中繪製波形。我使用FFmpeg對音頻文件進行了解複用/解碼,並且我有這些信息:採樣緩衝區,採樣緩衝區的大小,音頻文件的持續時間(以秒爲單位),採樣率(44100,4800等),採樣大小,採樣格式(uint8,int16,int32,float,double)和原始音頻數據本身。從音頻中繪製波形的算法

挖掘在互聯網上,我發現這個算法(更多here):

白噪聲:

White Noise

算法

所有你需要做的是隨機每個樣本從幅度到 幅度。我們並不關心大多數情況下的頻道數量,因此我們只需用新的隨機數填充每個樣本。

Random rnd = new Random(); 
short randomValue = 0; 

for (int i = 0; i < numSamples; i++) 
{ 
    randomValue = Convert.ToInt16(rnd.Next(-amplitude, amplitude)); 
    data.shortArray[i] = randomValue; 
} 

這真的很不錯,但我並不想得出這種方式,但這種方式:

audacity

有如何我可以使用來繪製任何算法或想法我有什麼信息?

+0

你似乎是試圖利用波形** **生成算法時,你已經有你的波形。所以這聽起來像你需要什麼都不做。 – Galik 2014-10-30 21:23:44

+0

@Galik - 你的意思是「你已經有了你的波形」?我唯一擁有的是關於上面列出的原始文件的信息,現在我正在尋找一種使用這些信息繪製波形的算法。 – yayuj 2014-10-30 21:26:30

+0

那麼你鏈接的算法與繪製波無關。他們產生了浪潮。你使用ffmpeg生成你的wave來轉換原始聲音數據。所以你不需要發電機。我想也許你需要的是某種GUI框架,它允許你在屏幕上繪製東西。 – Galik 2014-10-30 21:28:11

回答

5

首先,您需要確定屏幕上每個樣本的最終位置。

int x = x0 + sample_number * (xn - x0)/number_of_samples; 

現在,對於具有相同x所有樣品中,確定最小和分別最大爲正值和負值。繪製一條垂直線,一條從負極性到正極極性的黑暗線,然後從極性極小體到正極極性之間的一個小極體。

編輯:想想這個多一點,你可能想用平均值而不是最小值作爲內線。

1

底部圖形只包含更長的時間跨度,所以如果您增加了numSamples,則會得到更緊密的圖形。但是在白噪聲下,你不會看到正常聲音/音樂中會出現的高峯和低谷。

所以,如果你可以增加你的樣本量,或者至少增加你的樣本週期(X軸),你將開始模擬底部圖表。使用其中兩個來獲得立體聲效果。

3

有一個不錯的節目audiowaveform來自英國廣播公司R & D做你想做的,你可以諮詢他們的來源。

+0

肯定會有所幫助。謝謝。 – yayuj 2014-10-30 21:35:24

1

showwavespic

ffmpeg可以得出與showwavespic過濾器的波形。

enter image description here

ffmpeg -i input -filter_complex "showwavespic=split_channels=1" output.png 

的選項見showwavespic filter documentation

showwaves

您也可以使實時波形的視頻與showwaves過濾器。

ffmpeg -i input -filter_complex \ 
"showwaves=s=600x240:mode=line:split_channels=1,format=yuv420p[v]" \ 
-map "[v]" -map 0:a -movflags +faststart output.mp4 

查看showwaves filter documentation的選項。

1

第二波形可能是一個簡單的之字形圖形的列近似。

每一列是從先前採樣幅度與當前樣本幅度的線。

因此,將所有樣本作爲預先測試的點讀取到畫布或紋理中,然後,一旦您完成了該操作,就可以執行兩種情況,使用條而不是點,向上繪製至最後一個樣本或向上取決於哪一個更高,只要你畫一條線到兩條線。這確保了波形很小,下一個採樣之間的能量較低,而高能量則較高。

您可以爲它定義別名並測量多個樣本,它只取決於您正在運行的硬件,如果您想讀取1000ds樣本並製作波形的巨大二維數組表示,然後將其向下變爲較小的可顯示圖像,或者如果您只想運行512個樣本並更新速度較快。在程序中使用2d畫布時,應該快速製作512個以上樣本的詳細波形。

...不同的選項是一樣的,在其它應答的灰度波形,從+當前樣本吸取絕對值線至CURRENT樣品。

它有助於平均多個樣本,即曾經4次採樣或獲得每4個樣本的最大有少不穩定圖,它的快速走樣的孩子。

+0

我做了一些基於使用條形圖來逼近曲折曲線圖的代碼,我發現畫布繪製函數對於內存有點慢,我發現如果將44100除以8或16,則使用每16個樣本的最大值,它仍然看起來非常清晰,然後SR是每秒2900,這很好,並且節省了內存......我發現顯卡的頂點顯示速度比嘗試在textre中顯示要快得多,所以我製作了一個平面多邊形作爲線條,在二維畫布代碼中,無論如何,您可能會錯過這麼多比較發送ot圖形shadre製作多邊形。 dx11代碼是onunityforum – predatflaps 2016-04-01 09:31:18