问题 C#音频 - 如何伸展时间(不同速度,相同音高)


我正在尝试在C#(VS2008)中创建一个winform应用程序,它可以加载一个mp3(其他格式会很好,但至少是mp3)并能够调整播放速度(速度)而不影响音高。我真的不需要任何其他音频效果。我尝试使用DirectShow,但似乎没有提供时间拉伸功能。我能够融入 irrklang 但这似乎没有时间伸展能力。所以现在我转向了 SoundTouch。这肯定有能力但我不清楚如何在C#中实现。

几天之后,我所做的就是在SoundTouch DLL上使用DLLImport,并且能够成功检索版本号。在这一点上,我甚至不确定我是否可以做我正在尝试使用SoundTouch做的事情。任何人都可以提供一些关于如何实现SoundTouch或具有我正在寻找的功能的不同库的指导?谢谢。


9384
2018-02-23 18:49


起源



答案:


如果有人仍然感兴趣,我已经为SoundTouch库编写了.Net包装类。 http://code.google.com/p/soundtouchnet/


8
2017-11-16 23:34





答案是SoundTouch可以做你想做的事。

看一下示例程序 SoundStretch。它给出了使用SoundTouch库来改变速度(不改变音高)以及改变音高(不改变速度)和播放速率(改变音高和速度)的例子。我会查看源代码并使用您需要的内容。

我看到的唯一问题是你使用的是mp3格式,而且它使用的是WAV格式,所以你需要先转换文件。我真的不认为你会找到一个程序直接在任何类型的压缩文件上执行你想要的程序,因为用于执行此类操作的方法的性质。它使用了 相位声码器 如果你想进一步研究整个过程。


6
2018-02-23 19:35



写评论基本上是说同样的事情。你打败了我;) - Merlyn Morgan-Graham
这种情况一直发生在我身上。 - Justin Peel
好吧,至少我知道我正走在正确的大道上。我现在的问题是我看到的例子(我当然可能遗漏了一些重要的东西)都是用C ++编写的。使用DLLImport,我可以在C#中使用它:SOUNDTOUCHDLL_API const char * __ stdcall soundtouch_getVersionString();为了我的目的,我需要能够调用:SOUNDTOUCHDLL_API HANDLE __stdcall soundtouch_createInstance();并且SOUNDTOUCHDLL_API void __stdcall soundtouch_setTempoChange(HANDLE h,float newTempo);那就是我现在完全陷入困境的地方。 - heath
@heath:不要将新问题写入评论。编辑此问题并在最后添加您正在进行的调查(或问题)或打开一个新问题。否则没人会看到你被困在下一个地方。 - Oliver


答案:


如果有人仍然感兴趣,我已经为SoundTouch库编写了.Net包装类。 http://code.google.com/p/soundtouchnet/


8
2017-11-16 23:34





答案是SoundTouch可以做你想做的事。

看一下示例程序 SoundStretch。它给出了使用SoundTouch库来改变速度(不改变音高)以及改变音高(不改变速度)和播放速率(改变音高和速度)的例子。我会查看源代码并使用您需要的内容。

我看到的唯一问题是你使用的是mp3格式,而且它使用的是WAV格式,所以你需要先转换文件。我真的不认为你会找到一个程序直接在任何类型的压缩文件上执行你想要的程序,因为用于执行此类操作的方法的性质。它使用了 相位声码器 如果你想进一步研究整个过程。


6
2018-02-23 19:35



写评论基本上是说同样的事情。你打败了我;) - Merlyn Morgan-Graham
这种情况一直发生在我身上。 - Justin Peel
好吧,至少我知道我正走在正确的大道上。我现在的问题是我看到的例子(我当然可能遗漏了一些重要的东西)都是用C ++编写的。使用DLLImport,我可以在C#中使用它:SOUNDTOUCHDLL_API const char * __ stdcall soundtouch_getVersionString();为了我的目的,我需要能够调用:SOUNDTOUCHDLL_API HANDLE __stdcall soundtouch_createInstance();并且SOUNDTOUCHDLL_API void __stdcall soundtouch_setTempoChange(HANDLE h,float newTempo);那就是我现在完全陷入困境的地方。 - heath
@heath:不要将新问题写入评论。编辑此问题并在最后添加您正在进行的调查(或问题)或打开一个新问题。否则没人会看到你被困在下一个地方。 - Oliver


在C#中使用SoundTouch的另一种方法是使用BASS声音库(http://un4seen.com)使用BASS.NET包装器和BASS_FX插件。 BASS_FX使用SoundTouch进行TimeStretching。


3
2018-02-20 21:26





这是从C#调用的一种可能方法。您需要在C ++中编写COM包装器以包装SoundTouch DLL。准备好COM包装器后,可以将其导入.NET(C#)项目,并通过COM Wrapper调用底层的SoundTouch DLL。希望这可以帮助。


-1
2018-03-08 08:12