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