c#、mp3 和文件路径

c#, mp3 and file path

你好,我是 c# 的新手,我正在做一个需要播放 mp3 文件的小游戏。

我一直在搜索这个并使用 wmp 来做,就像这样:

    WindowsMediaPlayer myplayer = new WindowsMediaPlayer();
    myplayer.URL = @"c:\somefolder\project\music.mp3";
    myplayer.controls.play();

我可以通过mp3文件的完整路径成功播放文件。问题是我找不到直接从项目文件夹中使用文件的方法,我的意思是,如果我将项目复制到另一台计算机,mp3 文件的路径将无效并且不会播放声音。我觉得我现在处于死胡同,所以如果有人能帮助我,我将不胜感激!提前致谢

将 MP3 文件添加到您的项目中。同时将其标记为始终复制到输出文件夹。在这里,您有一个如何操作的教程 (How to include other files to the output directory in C# upon build?)。那么你可以这样参考:

你必须使用:

using System.Windows.Forms;

然后你可以这样使用:

WindowsMediaPlayer myplayer = new WindowsMediaPlayer();
myplayer.URL = Application.StartupPath + "\music.mp3";
myplayer.controls.play();

只要您的 mp3 和 exe 在同一文件夹中,这应该适用于任何机器。

  string mp3Path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + mp3filename

另一个简单的选项是:

WindowsMediaPlayer myplayer = new WindowsMediaPlayer();
string mp3FileName = "music.mp3";
myplayer.URL = AppDomain.CurrentDomain.BaseDirectory + mp3FileName;
myplayer.controls.play();

这将从您的可执行文件所在的目录播放 MP3。同样重要的是要注意不需要反射,这会增加不必要的性能成本。

作为关于将 MP3 作为资源嵌入的评论的后续,添加以下代码后即可实现:

Assembly assembly = Assembly.GetExecutingAssembly();
string tmpMP3 = AppDomain.CurrentDomain.BaseDirectory + "temp.mp3";
using (Stream stream = assembly.GetManifestResourceStream("YourAssemblyName.music.mp3"))
using (Stream tmp = new FileStream(tmpMP3, FileMode.Create))
{
    byte[] buffer = new byte[32 * 1024];
    int read;

    while ((read = stream.Read(buffer, 0, buffer.Length)) > 0)
    {
        // Creates a temporary MP3 file in the executable directory
        tmp.Write(buffer, 0, read);
    }
}
WindowsMediaPlayer myplayer = new WindowsMediaPlayer();
myplayer.URL = tmpMP3;
myplayer.controls.play();
// Checks the state of the player, and sends the temp file path for deletion
myplayer.PlayStateChange += (NewState) =>
{
    Myplayer_PlayStateChange(NewState, tmpMP3);
};

private static void Myplayer_PlayStateChange(int NewState, string tmpMP3)
{
    if (NewState == (int)WMPPlayState.wmppsMediaEnded)
    {
        // Deletes the temp MP3 file
        File.Delete(tmpMP3);
    }
}