2010-02-23 10 views
11

Ich versuche, eine Winform-App in C# (VS2008) zu machen, die ein mp3 laden kann (andere Formate wären nett, aber mindestens mp3) und in der Lage sein, die Wiedergabegeschwindigkeit (Tempo) einzustellen, ohne die Tonhöhe zu beeinflussen. Ich brauche wirklich keine anderen Audioeffekte. Ich habe versucht, DirectShow zu verwenden, aber das scheint keine Time-Stretch-Funktionen zu bieten. Ich konnte irrklang integrieren, aber das scheint auch nicht die Time-Stretch-Fähigkeit zu haben. So, jetzt habe ich weitergegangen auf SoundTouch. Das hat sicherlich die Fähigkeiten, aber ich bin sehr unklar, wie in C# zu implementieren ist.C# Audio - Wie man Zeit dehnt (unterschiedliches Tempo, gleiche Tonhöhe)

Nach ein paar Tagen, über alles, was ich erreicht habe, ist DLLImport auf der SoundTouch DLL und bin in der Lage, eine Versionsnummer erfolgreich abrufen. An diesem Punkt bin ich mir nicht einmal sicher, ob ich das tun kann, was ich mit SoundTouch zu tun versuche. Kann mir jemand Anleitung geben, wie man SoundTouch oder eine andere Bibliothek mit den Fähigkeiten, die ich suche, implementieren kann? Vielen Dank.

Antwort

6

Die Antwort ist, dass SoundTouch tun kann, was Sie tun möchten.

Schauen Sie sich das Beispielprogramm SoundStretch an. Es enthält Beispiele für die Verwendung der SoundTouch-Bibliothek zur Änderung des Tempos (ohne Änderung der Tonhöhe) sowie zur Änderung der Tonhöhe (ohne Änderung des Tempos) und der Wiedergaberate (Änderung von Tonhöhe und Tempo). Ich würde den Quellcode durchsehen und verwenden, was Sie brauchen.

Das einzige Problem, das ich sehe, ist, dass Sie ein MP3-Format verwenden und dies ein WAV-Format verwendet, so dass Sie die Datei zuerst konvertieren müssen. Ich glaube wirklich nicht, dass Sie ein Programm finden werden, das das, was Sie wollen, direkt in jeder Art von komprimierter Datei findet, wegen der Art der Methode, die für solche Dinge verwendet wird. Es verwendet eine phase vocoder, wenn Sie in den gesamten Prozess ein bisschen mehr suchen möchten.

+0

schrieb einen Kommentar, der im Grunde dasselbe sagt. Du hast mich dazu geschlagen;) –

+0

Das passiert mir die ganze Zeit. –

+0

Ok, naja, zumindest weiß ich, dass ich die rechte Straße hinuntergehe. Mein Problem ist jetzt, dass die Beispiele, die ich sehe (und ich kann sicherlich etwas wichtiges fehlen), alle in C++ sind. Mit DLLImport kann ich dies in C# arbeiten: SOUNDTOUCHDLL_API const char * _ stdcall soundtouch_getVersionString(); Für meine Zwecke müsste ich anrufen können: SOUNDTOUCHDLL_API HANDLE __stdcall soundtouch_createInstance(); Und SOUNDTOUCHDLL_API void __stdcall soundtouch_setTempoChange (HANDLE h, float newTempo); Und das ist, wo ich jetzt völlig steckengeblieben bin. – heath

-1

Hier ist ein möglicher Ansatz zum Aufrufen von C#. Sie müssen einen COM-Wrapper in C++ schreiben, um die SoundTouch-DLL zu umschließen. Sobald Sie den COM-Wrapper bereit haben, können Sie ihn in Ihr .NET (C#) - Projekt importieren und die zugrunde liegende SoundTouch-DLL über den COM-Wrapper aufrufen. Hoffe das hilft.

3

Eine weitere Möglichkeit der Verwendung von Soundtouch in C# ist die BASS Sound-Bibliothek (http://un4seen.com) mit dem BASS.NET Wrapper und dem BASS_FX Plugin zu verwenden. BASS_FX verwendet SoundTouch für TimeStretching.