2010-02-23 4 views
11

Я пытаюсь создать приложение winform в C# (VS2008), которое может загрузить mp3 (другие форматы будут приятными, но mp3 как минимум) и быть в состоянии настроить скорость воспроизведения (темп), не влияя на высоту тона. Мне действительно не нужны никакие другие звуковые эффекты. Я пробовал использовать DirectShow, но, похоже, не предлагает возможности для увеличения времени. Я смог включить irrklang, но это, похоже, не имеет возможности растягивания времени. Итак, теперь я перешел на SoundTouch. Это, безусловно, имеет возможности, но я не совсем понимаю, как реализовать на C#.C# Audio - Как растянуть время (разные темпы, та же высота)

После нескольких дней этого, обо всем, что я сделал, используется DLLImport в SoundTouch DLL и я могу успешно получить номер версии. На данный момент я даже не уверен, могу ли я делать то, что я пытаюсь сделать с SoundTouch. Может ли кто-нибудь предложить какое-то руководство по использованию SoundTouch или другой библиотеки с возможностями, которые я ищу? Спасибо.

ответ

6

Ответ заключается в том, что SoundTouch может делать то, что вы хотите сделать.

Посмотрите пример программы SoundStretch. В нем приводятся примеры использования библиотеки SoundTouch для изменения темпа (без изменения высоты), а также изменения высоты тона (без изменения темпа) и скорости воспроизведения (изменение темпа и темпа). Я бы посмотрел исходный код и использовал то, что вам нужно.

Единственная проблема, которую я вижу, это то, что вы используете формат mp3, и это использует WAV-формат, поэтому вам нужно сначала преобразовать файл. Я действительно не думаю, что вы найдете программу, которая делает то, что вы хотите, прямо на любом сжатом файле из-за природы метода, используемого для такого рода вещей. Он использует phase vocoder, если вы хотите изучить весь процесс немного больше.

+0

Написал комментарий, в основном говоря то же самое. Вы избили меня до этого;) –

+0

Это случается со мной все время. –

+0

Хорошо, ну, по крайней мере, я знаю, что иду по правому проспекту. Моя проблема заключается в том, что примеры, которые я вижу (и, конечно, возможно, не хватает чего-то важного), находятся на 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

-1

Вот один из возможных подходов к вызову с C#. Вам нужно написать COM-обертку на C++, чтобы обернуть вокруг SoundTouch DLL. После того, как у вас есть готовая оболочка COM, вы можете импортировать ее в свой проект .NET (C#) и вызвать базовую библиотеку SoundTouch DLL через COM Wrapper. Надеюсь это поможет.

3

Другим способом использования SoundTouch в C# является использование низкой звуковой частот библиотеки (http://un4seen.com) с BASS.NET оберткой и плагиным BASS_FX. BASS_FX использует SoundTouch для выполнения TimeStretching.

Смежные вопросы