2009-12-19 91 views
2

我正在寻找一种方法来创建上传到服务器的mp3文件的图形波形。从一个小小的研究我相信MP3将需要转换为原始格式首先...但我不知道如何创建此声音文件的波形.gif格式。asp.net从mp3创建波形图像

90%的声音文件长度超过60分钟。

我知道这将无法完成上传后,它需要被放入一个队列和处理。

我已经看过几个库,如跛脚,但似乎没有能够实现我在​​找什么。

任何指向正确方向的指针将不胜感激!

非常感谢! Paul

回答

2

您可能会发现FMODBASS可以为你做到这一点,很容易。我相信FMOD下载带有一个可视化的例子,所以你可以从中推断出来。他们都用MP3读取数据并进行必要的计算。

+0

我现在使用BASS API创建我的波形,完全可以完美地与大量的可用自定义选项一起工作。 非常感谢你的帮助! – 2009-12-20 02:41:05

+0

不客气:)。如果您打算将其用于商业目的,请不要忘记查看该许可证的使用情况。 – keyboardP 2009-12-20 03:14:47

+0

听起来像是为了他的目的而矫枉过正......我的意思是 - 这些是一些重型音频库,而不是便宜的。 – 2009-12-20 04:27:41

11

第一步是解压缩mp3。只要你将它作为一个批处理作业来执行,而不是将LAME作为库使用,只需使用现有的命令行程序将mp3转换为临时的WAV文件即可,这将更容易。然后找一个图书馆来阅读WAV文件 - 这是一个相对简单的格式,你应该在网上找到大量的示例代码,或者你可以在下午写自己的代码。

假设您的歌曲长度为60分钟:60分钟* 60秒/分钟* 44100样本/秒= 158,760,000个样本。 (如果它是立体声歌曲,则为两次)。如果图像宽度为1000像素,则只需要为每158,760个样本显示一个样本。 (另外,在这个分辨率下你不会看到太多的细节,也许更好的解决方案是显示前5分钟的波形,或者渲染用户可以滚动的更大图像)

无论如何,您要读取每个158,760个样本块(在此示例中)的音频样本,并将其呈现为代表该部分音频信号强度的垂直线。有两种方法可以做到这一点:

  1. 最大值超过该区域
  2. 根均方(RMS)在该区域价值

最大会告诉你峰值,而RMS会显示整体感知的响度。两者都很容易实施;试试看看哪一个看起来最好。

然后,你只需要将生成的图像变成一个gif。由于这是批量作业,如果我是你,我会写出一个BMP文件(一种非常简单的文件格式),然后使用像ImageMagick的“convert”这样的命令行程序将其转换为GIF。最后,最后一个注意:如果你真的真的棘手,你可以读取MP3帧,直接从比特流中提取增益,而不需要解码整个事情。这就是我做过的here,欢迎您使用它 - 但它不适合心脏不好。它比解码整个MP3大约快100倍,但是你得到的波形将是一个粗略的近似值。

+0

谢谢你的详细解答,解释,简而言之需要做处理这算什么。 我之后的图像不一定非常完美,它只是60分钟DJ混音中的高峰和低谷的粗略指南。 您提供的代码看起来很有前途,但它是我不知道的java,但仍可以解密某些信息。 谢谢! – 2009-12-19 17:24:45

+2

不要粗鲁,但如果你喜欢我的回答,我会感激你,如果你会接受它,或至少upvote它。这就是这个网站的工作原理,你知道的。 – dmazzoni 2009-12-19 21:42:25

+1

对不起,我不知道我有privelages这样做...我只是刚刚加入,我第一次尝试它说我没有足够的分数...投票添加,因为它是一个有用的资源!谢谢! – 2009-12-20 03:16:18

1

您可以使用C#代码here来生成波形图像。之后,您应该使用常见的System.Drawing库将其保存为GIF文件。

+0

我已经看过这段代码并试图让它工作,但是每次我试图用16位WAV文件测试它时,它都会崩溃应用程序。 你之前有没有使用过这段代码? – 2009-12-19 17:26:20

+0

不,我没有,但我认为值得您花时间来解决这些错误。 – 2009-12-19 22:16:34