web-dev-qa-db-ja.com

C#でmp3ファイルを再生する方法は?

このガイドを使用して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フォルダにあります。

13
Waffles

私は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);
         }
      }
}
10
Joe Doyle

あなたがする必要があるのは、Window Media PlayerCOMコンポーネントへの参照を追加することだけです。 System32ディレクトリにあるファイルwmp.dllへの参照を追加する必要があります。

8

それがまだ関連しているかどうかはわかりませんが、試してみたところ、コードがメインスレッドで実行されていない場合、つまり_this.InvokeRequired == false_でのみ機能しました。

したがって、次のようなことを試してみることをお勧めします。

_ThreadPool.QueueUserWorkItem(
             delegate(object param)
             {
                 WMPLib.WindowsMediaPlayer player = new WMPLib.WindowsMediaPlayer();
                 player.URL = "song.mp3";                     
             });
_

プレーヤーは自動再生に設定されているため、player.controls.play()は必要ありません。

メインスレッドが正しく再生されない理由はわかりませんが、これがお役に立てば幸いです。

4
AlonEl

「main」イベントからコードを削除して、「form_load」や「button_click」などに配置することができます。見た目が良ければ、うまくいくはずです。また、Robert Sederが提案したように、mp3ファイルのパス全体を書き込もうとすることもできます。

1
futile

私が試みることがいくつかあります:

1)万が一の場合に備えて、その.mp3ファイルへのパスを完全修飾します。 2)a.Ctlcontrols.play();を試してください。代わりに。

また、ロードしようとしているのはWindows(ActiveXコントロール)であるとほぼ確信しています。ロードして機能させるには、Windowsコンテキストが必要になる場合があります。以前に使用したことがあるので、.mp3を再生する別の方法があると確信していますが、コードが見つかりませんでした。ただし、DirectXSDKの一部であった可能性があります。お役に立てば幸いです。

0
Robert Seder

簡単な方法として、次のコードが必要です。1。最初にSystem.Runtime.InteropServicesnamespaseを追加します。 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);
}
0

私は同じ問題を抱えていて、プレーヤーを静的として設定することで解決しました。例:

public class MiClass(){
static WMPLib.WindowsMediaPlayer wplayer;
private void PlayMusic()
    {
        wplayer = new WMPLib.WindowsMediaPlayer();
        wplayer.URL = "c:\shoryuken.mp3";
        wplayer.controls.play();
    }
}
0
i31nGo