2010-02-23 12 views
11

Próbuję zrobić aplikację WinForm w C# (VS2008), która może załadować mp3 (inne formaty byłyby ładne, ale mp3 na minimum) i być w stanie dostosować prędkość odtwarzania (tempo) bez wpływu na wysokość dźwięku. Naprawdę nie potrzebuję żadnych innych efektów dźwiękowych. Próbowałem używać DirectShow, ale wydaje się, że nie oferuje to możliwości rozciągnięcia czasu. Udało mi się wprowadzić irrklang, ale wydaje się, że nie ma również możliwości rozciągnięcia czasu. Teraz przeniosłem się na SoundTouch. To na pewno ma możliwości, ale jestem bardzo niejasny, jak zaimplementować w C#.C# Audio - Jak rozciągnąć czas (inne tempo, ten sam skok)

Po kilku dniach o tym wszystkim, co osiągnąłem, korzystam z DLLImport w bibliotece SoundTouch DLL i jestem w stanie z powodzeniem pobrać numer wersji. W tym momencie nie jestem nawet pewien, czy mogę zrobić to, co próbuję zrobić z SoundTouch. Czy każdy może zaoferować jakieś wskazówki dotyczące implementacji SoundTouch lub innej biblioteki z możliwościami, których szukam? Dziękuję Ci.

Odpowiedz

6

Odpowiedź brzmi, że SoundTouch może robić to, co chcesz.

Spójrz na przykładowy program SoundStretch. Podano przykłady użycia biblioteki SoundTouch do zmiany tempa (bez zmiany wysokości tonu), a także zmiany wysokości tonu (bez zmiany tempa) i szybkości odtwarzania (zmiana zarówno wysokości, jak i tempa). Przejrzałbym kod źródłowy i użyłbym tego, czego potrzebujesz.

Jedyny problem jaki widzę to to, że używasz formatu mp3 i używa formatu WAV, więc najpierw musisz przekonwertować plik. Naprawdę nie sądzę, że znajdziesz program, który robi to, co chcesz, bezpośrednio na jakimkolwiek skompresowanym pliku z powodu natury metody używanej do tego typu rzeczy. Używa ona phase vocoder, jeśli chcesz spojrzeć na cały proces nieco więcej.

+0

Pisałem komentarz w zasadzie mówiąc to samo. Uderzyłeś mnie w to;) –

+0

To mi się przydarza przez cały czas. –

+0

Dobrze, przynajmniej wiem, że schodzę właściwą drogą. Moim problemem jest to, że przykłady, które widzę (i na pewno może brakować czegoś ważnego) są w C++. Za pomocą DLLImport, mogę uzyskać to działa w języku C#: SOUNDTOUCHDLL_API const char * __ stdcall soundtouch_getVersionString(); Dla moich celów, będę musiał móc zadzwonić: SOUNDTOUCHDLL_API UCHWYTU __stdcall soundtouch_createInstance(); I SOUNDTOUCHDLL_API void __stdcall soundtouch_setTempoChange (UCHWYT h, float newTempo); I to tutaj całkowicie utknąłem. – heath

-1

Oto jedno z możliwych podejść do wywołania z C#. Musisz napisać opakowanie COM w C++, aby owijać bibliotekę SoundTouch DLL. Po przygotowaniu opakowania COM można go zaimportować do projektu .NET (C#) i wywołać bibliotekę DLL SoundTouch za pomocą opakowania COM. Mam nadzieję że to pomoże.

3

Innym sposobem korzystania SoundTouch w C# jest użycie biblioteki dźwięków niskich (http://un4seen.com) z owijki BASS.NET i wtyczki BASS_FX. BASS_FX używa SoundTouch do TimeStretching.

Powiązane problemy