当按下一个键时,我播放一个.wav
声音文件。但播放声音之前有一段延迟。
如何将文件复制到内存并从MemoryStream
而不是硬盘播放?
if (e.Key == Key.Enter) {
MediaPlayer player = new MediaPlayer();
Uri uri = new Uri("Sounds\\enter.wav", UriKind.RelativeOrAbsolute);
player.Open(uri);
player.Play();
}
我也在使用这个全局键盘钩子,它可能导致延迟。
如果您的要求是明确地使用MemoryStream
,那么就我所知,你不能使用MediaPlayer
。如果它适合你,你可以使用SoundPlayer
soundPlayer = new System.Media.SoundPlayer(memoryStream);
soundPlayer.Play();
要么
soundPlayer.Stream.Seek(0, SeekOrigin.Begin);
soundPlayer.Stream.Write(buffer, 0, buffer.Length);
soundPlayer.Play();
MediaPlayer
有延迟,它的设计不是以这种方式播放短音。
这是完全未经测试的,但是,您可以在SoundPlayer
线程池或后台线程中尝试Task.Run
。这样你就可以获得缓冲性能提升
byte[] buffer;
Task.Run(() =>
{
soundPlayer = new SoundPlayer()
soundPlayer.Stream.Seek(0, SeekOrigin.Begin);
soundPlayer.Stream.Write(buffer, 0, buffer.Length);
soundPlayer.Play();
// or
soundPlayer = new System.Media.SoundPlayer(memoryStream);
soundPlayer.Play();
});
或另一种方法Play multiple sounds using SoundPlayer
// Sound api functions
[DllImport("winmm.dll")]
static extern Int32 mciSendString(string command, StringBuilder buffer, int bufferSize, IntPtr hwndCallback)
...
private void PlayWorker()
{
StringBuilder sb = new StringBuilder();
mciSendString("open \"" + FileName + "\" alias " + this.TrackName, sb, 0, IntPtr.Zero);
mciSendString("play " + this.TrackName, sb, 0, IntPtr.Zero);
}
最后
如果以上仍然不合适,你可能更擅长查看DirectSound
或甚至nAudio
,或者在这方面有更多力量的东西