按下某个键时播放.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();
}
我也在使用这个全局键盘钩子,它可能导致延迟。
答案 0 :(得分:1)
如果您要求明确地使用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
,或者在这方面具有更多权力的东西