从资源获取媒体文件

时间:2014-02-11 07:11:29

标签: c# reference media audio system-sounds

我为某些短信添加了通知声音,作为我项目主文件的参考,并尝试按以下方式运行

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");

2 个答案:

答案 0 :(得分:1)

根据documentation判断,您的资源流不好。

  

Play方法使用新线程播放声音。如果你打电话给Play   在.wav文件加载到内存之前,.wav文件将会   在播放开始前加载。您可以使用LoadAsync或Load   提前将.wav文件加载到内存的方法。在.wav文件之后   从Stream或URL成功加载,以后调用回放   SoundPlayer的方法不需要重新加载.wav文件   直到声音的路径改变。

     

如果.wav文件还没有   指定或无法加载,Play方法将播放默认值   发出哔哔声。

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

解决方案(基于ResourceManager

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();
    }
}

答案 1 :(得分:0)

似乎System.Media.SoundPlayer类支持的WAV格式非常有限。 我已经尝试过使用字符串路径构造函数,它可以处理一些.wav文件,但是对其他文件失败了。

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

注意代码如何用于“success”字符串,并为“fail”字符串抛出InvalidOperationException。

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        System.Media.SoundPlayer player;

        public Form1()
        {
            InitializeComponent();
            string success = @"C:\Windows\Media\Windows Battery Critical.wav";
            string fail = @"C:\Windows\Media\Sonata\Windows 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文件编写代码,并告诉我们它是如何工作的。