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);
}
}
你好,我是 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);
}
}