このガイドを使用して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フォルダにあります。
私はWindowsMedia Player COMオブジェクトを使用していませんが、 ここにリンクがあります 別の方法へ。 (私は作者ではありません。)MP3を再生するためにwinmm.dllを呼び出すためにpinvokeを使用します。 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);
}
}
}
あなたがする必要があるのは、Window Media PlayerCOMコンポーネントへの参照を追加することだけです。 System32ディレクトリにあるファイルwmp.dllへの参照を追加する必要があります。
それがまだ関連しているかどうかはわかりませんが、試してみたところ、コードがメインスレッドで実行されていない場合、つまり_this.InvokeRequired == false
_でのみ機能しました。
したがって、次のようなことを試してみることをお勧めします。
_ThreadPool.QueueUserWorkItem(
delegate(object param)
{
WMPLib.WindowsMediaPlayer player = new WMPLib.WindowsMediaPlayer();
player.URL = "song.mp3";
});
_
プレーヤーは自動再生に設定されているため、player.controls.play()
は必要ありません。
メインスレッドが正しく再生されない理由はわかりませんが、これがお役に立てば幸いです。
「main」イベントからコードを削除して、「form_load」や「button_click」などに配置することができます。見た目が良ければ、うまくいくはずです。また、Robert Sederが提案したように、mp3ファイルのパス全体を書き込もうとすることもできます。
私が試みることがいくつかあります:
1)万が一の場合に備えて、その.mp3ファイルへのパスを完全修飾します。 2)a.Ctlcontrols.play();を試してください。代わりに。
また、ロードしようとしているのはWindows(ActiveXコントロール)であるとほぼ確信しています。ロードして機能させるには、Windowsコンテキストが必要になる場合があります。以前に使用したことがあるので、.mp3を再生する別の方法があると確信していますが、コードが見つかりませんでした。ただし、DirectXSDKの一部であった可能性があります。お役に立てば幸いです。
簡単な方法として、次のコードが必要です。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);
}
私は同じ問題を抱えていて、プレーヤーを静的として設定することで解決しました。例:
public class MiClass(){
static WMPLib.WindowsMediaPlayer wplayer;
private void PlayMusic()
{
wplayer = new WMPLib.WindowsMediaPlayer();
wplayer.URL = "c:\shoryuken.mp3";
wplayer.controls.play();
}
}