使用MediaPlayer Class从内存播放WAV文件

问题描述 投票:0回答:1

当按下一个键时,我播放一个.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

c# wpf
1个回答
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();

Update

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

© www.soinside.com 2019 - 2024. All rights reserved.