我正在尝试使用本指南在C#中播放MP3文件: http://www.crowsprogramming.com/archives/58
我正在列出所有内容,但我仍然无法在我的C#程序中播放任何音乐。谁能告诉我我做错了什么?
static void Main(string[] args)
{
WMPLib.WindowsMediaPlayer a = new WMPLib.WindowsMediaPlayer();
a.URL = "song.mp3";
a.controls.play();
}
音乐文件“Song”位于bin文件夹中。
答案 0 :(得分:10)
我没有使用Windows Media Player COM对象,而是使用here's a link替代方法。 (我不是作者。)它使用pinvoke调用winmm.dll来播放MP3。我在Windows Server 2008上对它进行了测试,结果很好。
以下是使用链接代码的示例类。
using System.Runtime.InteropServices;
public class MP3Player
{
private string _command;
private bool isOpen;
[DllImport("winmm.dll")]
private static extern long mciSendString(string strCommand,StringBuilder strReturn,int iReturnLength, IntPtr hwndCallback);
public void Close()
{
_command = "close MediaFile";
mciSendString(_command, null, 0, IntPtr.Zero);
isOpen = false;
}
public void Open(string sFileName)
{
_command = "open \"" + sFileName + "\" type mpegvideo alias MediaFile";
mciSendString(_command, null, 0, IntPtr.Zero);
isOpen = true;
}
public void Play(bool loop)
{
if(isOpen)
{
_command = "play MediaFile";
if (loop)
_command += " REPEAT";
mciSendString(_command, null, 0, IntPtr.Zero);
}
}
}
答案 1 :(得分:8)
您需要做的就是添加对Window Media Player COM组件的引用。您需要添加对文件wmp.dll的引用,您可以在System32目录中找到它。
答案 2 :(得分:4)
我不确定它是否仍然相关但是当我尝试它时,只有当代码不在主线程中运行时才会起作用,即this.InvokeRequired == false
所以,我会建议你尝试类似的东西:
ThreadPool.QueueUserWorkItem(
delegate(object param)
{
WMPLib.WindowsMediaPlayer player = new WMPLib.WindowsMediaPlayer();
player.URL = "song.mp3";
});
由于播放器设置为自动播放,因此不需要 player.controls.play()
。
我不确定为什么主线程无法正常播放,但我希望这会有所帮助。
答案 3 :(得分:1)
你可能会尝试从“main”事件中删除你的代码并将其放入“form_load”或“button_click”或类似的东西。导致它的外观,它应该工作。也像Robert Seder建议的那样,你可以尝试编写mp3文件的整个路径。
答案 4 :(得分:0)
我会尝试一些事情:
1)完全限定.mp3文件的路径,以防万一。 2)尝试a.Ctlcontrols.play();代替。
此外,我几乎可以肯定,您正在尝试加载Windows(ActiveX控件)。它可能需要一个Windows上下文才能加载和工作。我确定还有另一种方法可以播放.mp3,因为我之前使用过它,但我找不到代码。它可能是DirectX SDK的一部分。希望有所帮助。
答案 5 :(得分:0)
简单的方法,需要以下代码:
1.在第一个添加System.Runtime.InteropServices
namespase。
2.在班级创建:
static class Program
{
[DllImport("winmm.dll")]
private static extern long mciSendString(string strCommand,
StringBuilder strReturn,
int iReturnLength,
IntPtr hwndCallback);
//some code
}
3。在main方法中添加属性:
[STAThread]
static void Main(string[] args)
{//some code}
然后创建播放器方法,所以:
public void player()
{
mciSendString("open \"" + "mp3 file path" + "\" type mpegvideo alias MediaFile", null, 0, IntPtr.Zero);
mciSendString("play MediaFile", null, 0, IntPtr.Zero);
}
答案 6 :(得分:0)
我遇到了同样的问题,我通过将播放器设置为静态来解决,例如:
public class MiClass(){
static WMPLib.WindowsMediaPlayer wplayer;
private void PlayMusic()
{
wplayer = new WMPLib.WindowsMediaPlayer();
wplayer.URL = "c:\shoryuken.mp3";
wplayer.controls.play();
}
}