【发布时间】:2009-12-19 04:28:55
【问题描述】:
我正在寻找一种方法来创建上传到服务器的 mp3 文件的图形波形。通过一些研究,我相信 mp3 需要先转换为原始格式……但我不知道如何为这个声音文件创建 .gif 格式的波形。
90% 的声音文件长度超过 60 分钟。
我知道这在上传后无法立即完成,需要将其放入队列并进行处理。
我查看了几个库,例如 lame,但似乎没有一个能够实现我想要的。
任何指向正确方向的指针将不胜感激!
非常感谢! 保罗
【问题讨论】:
我正在寻找一种方法来创建上传到服务器的 mp3 文件的图形波形。通过一些研究,我相信 mp3 需要先转换为原始格式……但我不知道如何为这个声音文件创建 .gif 格式的波形。
90% 的声音文件长度超过 60 分钟。
我知道这在上传后无法立即完成,需要将其放入队列并进行处理。
我查看了几个库,例如 lame,但似乎没有一个能够实现我想要的。
任何指向正确方向的指针将不胜感激!
非常感谢! 保罗
【问题讨论】:
第一步是解压mp3。只要您将此作为批处理作业,而不是将 LAME 用作库,只需使用现有的命令行程序将 mp3 转换为临时 WAV 文件,这将容易得多。然后找一个库来读取WAV文件——它是一种相对简单的格式,你应该在网上找到很多示例代码,或者你可以自己写一个下午。
假设您的歌曲时长为 60 分钟:60 分钟 * 60 秒/分钟 * 44100 个样本/秒 = 158,760,000 个样本。 (如果是立体声歌曲,则为两倍。)如果您的图像宽度为 1000 像素,则您只想为每 158,760 个样本显示一个样本。
(顺便说一句,在该分辨率下您不会看到太多细节。也许更好的解决方案是仅显示前 5 分钟的波形,或者渲染用户可以滚动的更大图像?)
无论如何,您都希望读取每个 158,760 个样本块的音频样本(在本例中),并将其渲染为一条垂直线,表示该部分音频上的信号强度。有两种方法可以做到这一点:
最大值会显示峰值,而 RMS 会显示整体感知响度。两者都很容易实现;两个都试一下,看看哪个最好看。
然后您只需将生成的图像转换为 gif。因为无论如何这是一个批处理作业,如果我是你,我会写出一个 BMP 文件(一种非常简单的文件格式),然后使用像 ImageMagick 的“convert”这样的命令行程序将其转换为 GIF。
最后,最后一点:如果您真的很棘手,您可以读取 MP3 帧并直接从比特流中提取增益,而无需解码整个内容。这就是我所做的here,欢迎您使用它——但它不适合胆小的人。它比解码完整的 MP3 大约快 100 倍,但你得到的波形将是一个粗略的近似值。
【讨论】:
【讨论】:
您可以使用C#代码here生成波形图像。之后,您应该使用通用的System.Drawing 库将其保存为 GIF 文件。
【讨论】: