2010-07-26 97 views
7

我将music.mp3放在资源中,然后我将Windows Media Player添加到引用中。我写了这样的代码:如何从C#资源中播放.mp3文件?

WindowsMediaPlayer wmp = new WindowsMediaPlayer(); 
      wmp.URL = "music.mp3"; 
      wmp.controls.play(); 

它不起作用。如何从资源播放.mp3文件?

回答

6

我做到了:

WindowsMediaPlayer wmp = new WindowsMediaPlayer(); 
     Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("PostGen.Resources.Kalimba.mp3"); 
     using (Stream output = new FileStream ("C:\\temp.mp3", FileMode.Create)) 
     { 
      byte[] buffer = new byte[32*1024]; 
      int read; 

      while ((read= stream.Read(buffer, 0, buffer.Length)) > 0) 
      { 
       output.Write(buffer, 0, read); 
      } 
     } 
     wmp.URL = "C:\\temp.mp3"; 
     wmp.controls.play(); 

我们要删除这个临时文件:

private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     File.Delete("C:\\temp.mp3"); 
    } 
+0

像这样创建一个临时文件不应该被认为是一个有效的解决方案。 MediaPlayer.Play方法无论好还是坏(我认为更糟糕),都不会将流作为输入。你用你的exe部署MP3并将文件位置传递给该功能要好得多。 – Seanba 2016-07-29 18:08:52

2

我包的mp3解码库,并使其可用于.NET开发人员。你可以在这里找到它:

http://sourceforge.net/projects/mpg123net/

包括对MP3文件转换为PCM,并读取ID3标签的样本。

阅读您的资源,将其转换为PCM并将其输出到waveOut类,该类可作为interop .NET组件提供。无需创建临时文件。

可用

waveout的类也sourceforge上:

http://windowsmedianet.sourceforge.net/

0

或Tyr这一点;

 var file = $"{Path.GetTempPath()}temp.mp3"; 
      if (!File.Exists(file)) 
      { 
       using (Stream output = new FileStream(file, FileMode.Create)) 
       { 
        output.Write(Properties.Resources.Kalimba, 0, Properties.Resources.Kalimba.Length); 
       } 
      } 
      var wmp = new WindowsMediaPlayer { URL = file }; 
      wmp.controls.play();