Как играть в mp3 файлы на С#?

Я пытаюсь воспроизвести файл MP3 на С# с помощью этого руководства: http://www.crowsprogramming.com/archives/58

И я делаю все перечисленное, но я все еще не могу играть музыку в своей программе на С#. Может ли кто-нибудь сказать мне, что я делаю неправильно?

 static void Main(string[] args)
    {
        WMPLib.WindowsMediaPlayer a = new WMPLib.WindowsMediaPlayer();
        a.URL = "song.mp3";
        a.controls.play();
    }

Музыкальный файл "Song" находится в папке bin.

Ответы

Ответ 1

Я не использовал COM-объект проигрывателя Windows Media, но здесь ссылку на альтернативный метод. (Я не автор.) Он использует 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);
         }
      }
}

Ответ 2

все, что вам нужно сделать, это добавить ссылку на компонент COM-проигрывателя Window Media. Вам нужно добавить ссылку на файл wmp.dll, который вы можете найти в каталоге System32.

Ответ 3

Я не уверен, что это все еще актуально, но когда я его пробовал, он работал только тогда, когда код выполнялся не в основном потоке, т.е. this.InvokeRequired == false

Итак, я бы посоветовал вам попробовать что-то вроде:

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

player.controls.play() не требуется, так как плеер настроен на автоматическое воспроизведение.

Я не уверен, почему основной поток не будет воспроизводиться правильно, но я надеюсь, что это поможет.

Ответ 4

вы можете попытаться удалить свой код из "основного" события и поместить его в "form_load" или "button_click" или что-то в этом роде. вызывают то, как он выглядит, он должен работать. также, как предложил Роберт Седер, вы можете попытаться написать весь путь для mp3 файла.

Ответ 5

Есть несколько вещей, которые я хотел бы попробовать:

1) Полностью квалифицируйте путь к этому файлу .mp3, на всякий случай. 2) Попробуйте a.Ctlcontrols.play(); вместо этого.

Кроме того, я почти уверен, что это элемент управления Windows (ActiveX), который вы пытаетесь загрузить. Для загрузки и работы может потребоваться контекст Windows. Я уверен, что есть еще один способ воспроизвести .mp3, потому что я использовал его раньше, но я не смог найти код. Возможно, это была часть DirectX SDK. Надеюсь, что это поможет.

Ответ 6

Простым способом, нужен следующий код: 1.В первой добавьте System.Runtime.InteropServices namespase. 2.In класс создает:

 static class Program
{
        [DllImport("winmm.dll")]
        private static extern long mciSendString(string strCommand,
                                                 StringBuilder strReturn,
                                                 int iReturnLength,
                                                 IntPtr hwndCallback);

        //some code

}

3. Добавить атрибут в основном методе:

 [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);
}

Ответ 7

У меня была та же проблема, и я решил установить плеер как Статический, например:

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