2009-08-16 19 views
6

Próbuję napisać program SAMPLER, w którym każdy klawisz ma inny dźwięk (plik WAV).Odtwarzanie pliku .WAV w .NET

Czy ktoś może mi wyjaśnić lub podać link do wyjaśnienia, gdzie mogę nauczyć się grać w pliki WAV?

Jeśli to ma znaczenie, pracuję z Microsoft Visual C# i korzystam z WinForm.

+0

Nieco pokrewne: * http://stackoverflow.com/questions/4429513/play-wav-file-async-multiple-times-with-net * http://stackoverflow.com/questions/1087763/play-pcm-data-in- net-framework-2 – Pat

Odpowiedz

21
SoundPlayer simpleSound = new SoundPlayer(strAudioFilePath); 
simpleSound.Play(); 
+0

może wstrzymywać i wznawiać funkcje, które zostaną dla niego wykonane? – Rick2047

+0

Nie wiem, czy mogę być uczciwy, ale spójrz na tego gracza na niskim poziomie ... http://www.codeproject.com/KB/audio-video/cswavplay.aspx, a jeśli używasz .net 3.5, możesz użyć MediaElement, który obsługuje wstrzymywanie i wznawianie. –

+2

przy użyciu System.Media; –

4

użycie fmod, który jest po prostu najlepszy biblioteki dźwięku w całym wszechświecie

szczęście, wydają się stanowić C# wrapper dla najlepszego API dźwięku można spróbować sobie wyobrazić, i nie będzie Muszę zmienić jedną linijkę kodu, aby twój kod działał na konsolach playstation lub xbox lub cokolwiek innego, co powoduje, że programiści są prawie reaktywni (zgłaszasz błąd wieczorem, kładziesz się spać, a poprawiona kompilacja jest dostępna po przebudzeniu) dokumentacja jest czytelna, zrozumiała i OGROMNA wiele przykładów w SDK, co czyni bezużytecznym dostarczanie samouczka, ponieważ dokumentacja jest całkiem m uch perfect

Odtwarzanie wav z FMOD to tylko 5 linii kodu, a przy zaledwie 4 liniach więcej można zastosować efekty, łącząc równowagę i głośność odtwarzania z silnikiem 3d (w celu obsługi przecięć między punktem konca a źródło dźwięku, 4 linie ...

jeśli chcesz (użyj C# do), czy dźwięk, -> FMOD.

+0

Znalazłem to opakowanie pomocne http://stackoverflow.com/a/8470050/74585 –

1
SoundPlayer simpleSound = new SoundPlayer(strAudioFilePath); 
simpleSound.PlaySync(); 

ponieważ dźwięk jest odtwarzany asynchronicznie.

+1

to raczej komentarz do zaakceptowanej odpowiedzi. – jgauffin

0

To oparte na konsoli rozwiązanie wykorzystuje LINQPad (a więc wywołania metody rozszerzającej .Dump()) i NAudio (zauważysz, że używam pełnej przestrzeni nazw w kilku klasach, aby wyjaśnić). Aby poprawnie skonfigurować, wystarczy pobrać fragment kodu z http://share.linqpad.net/d7tli8.linq (dodałem NAudio z NuGet).

Aby uruchomić, otwórz w linqpad, ustaw wartość wavFilePath na lokalną ścieżkę pliku wave i naciśnij klawisz F5. Play jest asynchroniczne, więc robimy Console.ReadLine, aby czekać, aż to zrobi.

string wavFilePath = @"TODO"; 
var reader = new NAudio.Wave.AudioFileReader(wavFilePath); 
reader.Dump("AudioFileReader"); 
var sampleProvider = reader.ToSampleProvider().Dump("sample provider"); 

NAudio.Wave.WaveOut.DeviceCount.Dump("num waveout on comp"); 
var outputDeviceInfo = WaveOut.GetCapabilities(0).Dump(); 
var outputter = new WaveOut() { 
    DesiredLatency = 5000 //arbitrary but <1k is choppy and >1e5 errors 
    , NumberOfBuffers = 1 // 1,2,4 all work... 
    , DeviceNumber = 0 
}.Dump(); 
outputter.Init(reader); 
outputter.Play(); // async 
Console.Read(); 
outputter.Stop(); 

I to wyjście ze wszystkich nazywa .Dump wygląda na moim komputerze, w przypadku, gdy zastanawiasz się:

audiofilereader contents

sampleprovider and waveout info