首页 > 解决方案 > 服务器端 mp3 音高/键更改

问题描述

我正在为虚拟卡拉 OK 制作卡拉 OK 网站。我已经拥有了您能想到的所有功能,但只有一个。没有密钥更改功能。我在前端使用 Html/Javascript/Jquery,在后端使用 asp.net。有谁知道在服务器端进行音高更改的任何方法?

对于那些不知道的人,卡拉 OK 歌曲由 2 个压缩文件组成。您有一个用于图形的 CDG 文件和一个用于音频的 MP3 文件。为了节省空间,我确实将歌曲压缩了。二重奏的 CDG 部分(通常与 mp3 大小相同)压缩到原始大小的几乎 10%,因此只有以这种方式存储它们才有意义。

现在,当用户选择一首歌曲来唱歌时,服务器会将文件解压缩到一个临时文件夹中。他们在这个文件夹中闲逛,直到 Dj 将歌曲标记为已唱。那时它会从临时文件夹中删除文件。

话虽如此,我认为最好有一个ASP.Net 服务器端解决方案,因为 signalR 集线器可以在网站继续运行时处理音高变化,而无需通知。

我还阅读了有关通过拉伸或压缩音频文件长度来改变音高的信息。这在这种情况下不起作用,并且会使歌词与歌曲不匹配。

提前谢谢!!!

-Guy Cothal (kara.guycothal.com)

PS我现在正在寻找一个纯粹的服务器端解决方案。必须在 VB 或 C# 中。

标签: c#asp.netvb.netsignalrmp3

解决方案


我想到了!!!我最终使用了 NuGet 中的 NAudio 库。这是它背后的代码。

Public Shared Function pitchChange(sFileIn As String, sFileOut As String, iPitch As Integer) As Boolean
    Dim semitone = Math.Pow(2, (iPitch / 1) / 12)
    Try
        Using reader = New MediaFoundationReader(sFileIn)
            Dim pitch = New SmbPitchShiftingSampleProvider(reader.ToSampleProvider())
            Using device = New WaveOutEvent()
                pitch.PitchFactor = CSng(semitone)
                MediaFoundationEncoder.EncodeToMp3(pitch.ToWaveProvider(), sFileOut, 48000)
            End Using
        End Using
        Return True
    Catch exception As Exception
        Throw exception
        Return False
    End Try
End Function

我测试了两个方向的 12 个步骤。转换大约需要 20-25 秒,但这是在需要之前完成的。


推荐阅读