c# - 服务器端 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# 中。
解决方案
我想到了!!!我最终使用了 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 秒,但这是在需要之前完成的。
推荐阅读
- python - ChunkedArray 的内容、开始和停止 - 由lazyarray 构建
- python - 更改变量名中的数字
- webgl - 在 WebGL 中进行分层转换
- python - 如何在 python 3 中添加 30 分钟的时间对象?
- python - 检查Python中浮点数是否正常
- r - R中的方差 - 协方差矩阵
- html - DIV 未显示在正确位置的问题 - 已解决
- ios - 在构建目标为 iOS 12 的项目中加载 SwiftUI 画布是否存在一些问题?
- image - 如何在 Markdown 上调整图像大小?
- vim - 如何确保 formatoptions *never* 包含 `r` 或 `o`?