从资源获取媒体文件



我已经为一些文本消息添加了通知声音作为我项目主文件的参考,并尝试使其按如下方式工作

System.Reflection.Assembly a = System.Reflection.Assembly.GetExecutingAssembly();
System.IO.Stream s = a.GetManifestResourceStream("SignInSound.wav");
System.Media.SoundPlayer player = new System.Media.SoundPlayer(s);
player.Play();

播放了声音,但它不是我添加的绝对声音。而是播放标准窗口声音。有什么想法吗?

更新

问题在于从资源中获取文件

System.Reflection.Assembly a = System.Reflection.Assembly.GetExecutingAssembly();
System.IO.Stream s = a.GetManifestResourceStream("SignInSound.wav");

从文档来看,您的资源流很糟糕。

Play 方法使用新线程播放声音。如果您调用"播放" 在将.wav文件加载到内存之前,.wav文件将 在播放开始之前加载。您可以使用 LoadAsync 或 Load 提前将.wav文件加载到内存的方法。.wav文件之后 已成功从流或 URL 加载,将来调用播放 SoundPlayer 的方法不需要重新加载.wav文件 直到声音的路径发生变化。

如果.wav文件尚未 指定或加载失败,Play 方法将播放默认值 哔哔声。

所以问题是GetManifestResourceStream()没有做你认为它正在做的事情。

解决方案(基于资源管理器)

var thisType        = this.GetType();
var assembly        = thisType.Assembly;
var resourcePath    = string.Format("{0}.{1}", assembly.GetName().Name, thisType.Name);
var resourceManager = new ResourceManager(resourcePath, assembly);
var resourceName    = "SignInSound";
using ( Stream resourceStream = resourceManager.GetStream(resourceName) )
{
    using ( SoundPlayer player = new SoundPlayer(resourceStream) )
    {
        player.PlaySync();
    }
}

似乎System.Media.SoundPlayer类支持的 WAV 格式数量非常有限。我尝试使用字符串路径构造函数,它适用于某些.wav文件,而不适用于其他文件。

下面是一些示例代码。如果您使用的是Windows 7,则可以自己检查它,只需创建一个默认的新Windows窗体应用程序并向其添加一个按钮即可。

请注意代码如何用于"成功"字符串,并为"失败"字符串引发 InvalidOperationException。

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        System.Media.SoundPlayer player;
        public Form1()
        {
            InitializeComponent();
            string success = @"C:WindowsMediaWindows Battery Critical.wav";
            string fail = @"C:WindowsMediaSonataWindows Battery Critical.wav";
            player = new System.Media.SoundPlayer(success);
        }
        private void button1_Click(object sender, EventArgs e)
        {
            player.Play();
        }
    }
}

请注意,"success"下的文件的比特率为 1411 kbps,而另一个文件的比特率为 160 kbps。使用比特率为 1411 kbps 的 WAV 文件尝试您的代码,并告诉我们它是如何工作的。

相关内容

  • 没有找到相关文章

最新更新