使用MediaPlayer类

时间:2018-03-06 01:52:14

标签: c# wpf

按下某个键时播放.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();
}

我也在使用这个全局键盘钩子,它可能导致延迟。

https://gist.github.com/Ciantic/471698

1 个答案:

答案 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,或者在这方面具有更多权力的东西