2014-10-30 146 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