asp.net从mp3创建波形图像

asp.net从mp3创建波形图像,asp.net,mp3,waveform,Asp.net,Mp3,Waveform,我正在寻找一种方法来创建上传到服务器的mp3文件的图形波形。通过一些研究,我认为mp3需要先转换成原始格式……但我不知道如何为这个声音文件创建.gif格式的波形 90%的声音文件长度超过60分钟 我知道这将无法在上传后立即完成,需要将其放入队列并进行处理 我看过几个图书馆,比如lame,但似乎没有一个能达到我想要的 任何指向正确方向的指针都将不胜感激 多谢各位! Paul第一步是解压缩mp3。只要您将此作为一个批处理作业来执行,而不是将LAME用作库,只需使用现有的命令行程序将mp3转换为临时W

我正在寻找一种方法来创建上传到服务器的mp3文件的图形波形。通过一些研究,我认为mp3需要先转换成原始格式……但我不知道如何为这个声音文件创建.gif格式的波形

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

我知道这将无法在上传后立即完成,需要将其放入队列并进行处理

我看过几个图书馆,比如lame,但似乎没有一个能达到我想要的

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

多谢各位!
Paul

第一步是解压缩mp3。只要您将此作为一个批处理作业来执行,而不是将LAME用作库,只需使用现有的命令行程序将mp3转换为临时WAV文件,就可以轻松得多。然后找到一个库来读取WAV文件——这是一种相对简单的格式,你应该可以在网上找到很多示例代码,或者你可以在一个下午编写自己的代码

假设您的歌曲长度为60分钟:60分钟*60秒/分钟*44100个样本/秒=15876000个样本。(如果是立体声歌曲,则为两倍。)如果图像宽度为1000像素,则每158760个样本只需显示一个样本

(顺便说一句,在这种分辨率下,你看不到太多细节。也许更好的解决方案是只显示前5分钟的波形,或者渲染用户可以滚动的更大图像?)

无论如何,您希望读取158760个样本的每个块的音频样本(在本例中),并将其渲染为表示该部分音频上信号强度的垂直线。有两种方法可以做到这一点:

  • 该区域上的最大值
  • 该区域的均方根(RMS)值
  • 最大值将显示峰值,而RMS将显示整体感知响度。两者都易于实现;两个都试试看哪一个看起来最好

    然后,您只需要将生成的图像转换为gif。由于这是一个批处理作业,如果我是你,我会写出一个BMP文件(一种非常简单的文件格式),然后使用命令行程序(如ImageMagick的“convert”)将其转换为GIF


    最后,最后一点注意:如果你真的很狡猾,你可以读取MP3帧并直接从比特流中提取增益,而无需对整个过程进行解码。这就是我所做的,欢迎你使用它——但这不是为胆小的人准备的。它比解码整个MP3大约快100倍,但得到的波形将是粗略的近似值。

    您可以使用C代码生成波形图像。之后,您应该使用通用的
    System.Drawing
    库将其保存到GIF文件中。

    您可以很容易地找到或执行此操作。我相信FMOD下载附带了一个可视化示例,因此您可以从中推断。他们都读入MP3并执行必要的计算。

    感谢您提供的详细答案,简单地解释了需要做什么来处理此问题。我追求的图像并不一定要完美,它只是一个60分钟DJ混音中的高峰和低谷的粗略指南。您提供的代码看起来很有希望,但是我不知道它是java,但可能仍然能够从中破译一些信息。谢谢我不想无礼,但如果你喜欢我的回答,如果你愿意接受,或者至少投赞成票,我将不胜感激。这就是这个网站的运作方式,你知道。对不起,我不知道我有这样做的特权…我刚刚加入,第一次尝试时说我没有足够的分数…投票添加,因为这是一个有用的资源!谢谢大家!@dmazzoni你能解释一下你在做什么来估计Ringdroid的收益吗?(我看到你只是得到了2个字节的值,将其移位并称之为增益-但这背后的逻辑是什么?)我知道这很古老,但我们如何计算样本区域上的RMS值?我想通过计算一首歌的响度。我看过这段代码并试图让它工作,但是每次我试图用16位WAV文件测试它时,它都会使应用程序崩溃。你以前有没有使用过这段代码?没有,我没有,但我认为解决这些错误值得你花时间。我现在正在使用BASS api创建波形,在大量定制选项的支持下工作得非常完美。非常感谢,这帮了大忙!不客气:)。如果你打算将其用于商业目的,别忘了查看许可证的使用情况。就他的目的而言,听起来有点过分了。。。我的意思是-这些是一些重型音频库,而不是便宜的。我刚刚了解了许可证成本…哇,是的,这些是一些重型库!!我将尝试寻找一个更便宜/替代版本,但它创建的波形是完美的,而且非常简单!我同意许可费用可能相当昂贵(我想你是在看100欧元的),但这确实假设这是用于商业目的。如果没有,则可以免费使用。我想它可以作为一种临时措施来确保应用程序的所有部分都能正常工作。我刚刚看到这篇文章:如果你能将波形信息放入字节数组,这个链接将帮助你用C#显示它。