.NET winform播放音频文件

前提:最近要求做一个在winform端做一个音频文件播放的功能,至此,总结最近搜寻的相关资料。

一、微软提供了三种方式来播放音频文件

1、通过System.Media.SoundPlayer来播放

2、通过Com组件,添加axWindowsMediaPlayer控件播放。

3、通过ApI函数mcisendstring播放

————————————————————————————————————————分割线——————————————————————————————————————————

二:使用

1、通过System.Media.SoundPlayer

首先,在Com类型库中添加Windows Media Player组件的引用

添加的引用之后,就可以直接使用了

代码如下:

private void button2_Click(object sender, EventArgs e)
        {
       string path=@"D:/test.wav"; System.Media.SoundPlayer player
= new System.Media.SoundPlayer(); player.SoundLocation = path; player.LoadAsync(); player.PlaySync(); }

注意,这种方式,只支持波形文件的播放,波形文件主要包括wav格式的文件,其余的格式文件都不支持。

2、通过Com组件,添加axWindowsMediaPlayer控件播放。

首先,需要在工具箱中添加Com组件,具体步骤,找到工具箱,在工具箱的空白位置,右键,选择“选择项”,点击“Com”组件,选择 Windows Media Player,如果所示

选择之后,在工具箱中就会显示Windows Media Player,如图所示

将“Windows Media Player”控件拖到Form表单中,就显示了Windows Media Player播放器,如图所示

添加代码如下:

private void button1_Click(object sender, EventArgs e)
{            
  axWindowsMediaPlayer1.URL = @"D:/Test.mp3";
   axWindowsMediaPlayer1.settings.autoStart = true;            
}

注意:这种方式支持的文件格式比较多,主要包括:mp3、wav、mp4,wmv格式。

url参数可以直接访问服务器端的文件,前缀要添加http://;例如 string path="http://192.168.168.12:6666/JTERPAduio/Test.mp3";

3、通过ApI函数mcisendstring播放

封装Play类

using System;

using System.Runtime.InteropServices;

using System.Text;

using System.IO;

using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    class AudioPlay
    {

        //

        // TODO: 在此处添加构造函数逻辑

        //




        //定义API函数使用的字符串变量 

        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]

        private string Name = "";

        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]

        private string durLength = "";

        [MarshalAs(UnmanagedType.LPTStr, SizeConst = 128)]

        private string TemStr = "";

        int ilong;

        //定义播放状态枚举变量

        public enum State
        {

            mPlaying = 1,

            mPuase = 2,

            mStop = 3

        };

        //结构变量

        public struct structMCI
        {

            public bool bMut;

            public int iDur;

            public int iPos;

            public int iVol;

            public int iBal;

            public string iName;

            public State state;

        };



        public structMCI mc = new structMCI();



        //取得播放文件属性

        public string FileName
        {

            get
            {

                return mc.iName;

            }

            set
            {

                //ASCIIEncoding asc = new ASCIIEncoding(); 

                try
                {

                    TemStr = "";

                    TemStr = TemStr.PadLeft(127, Convert.ToChar(" "));

                    Name = Name.PadLeft(260, Convert.ToChar(" "));
                        
                    mc.iName = value;

                    ilong = APIClass.GetShortPathName(mc.iName, Name, Name.Length);

                    Name = GetCurrPath(Name);

                    //Name = "open " + Convert.ToChar(34) + Name + Convert.ToChar(34) + " alias media";

                    Name = "open " + Convert.ToChar(34) + Name + Convert.ToChar(34) + " alias media";

                    ilong = APIClass.mciSendString("close all", TemStr, TemStr.Length, 0);

                    ilong = APIClass.mciSendString(Name, TemStr, TemStr.Length, 0);

                    ilong = APIClass.mciSendString("set media time format milliseconds", TemStr, TemStr.Length, 0);

                    mc.state = State.mStop;

                }

                catch
                {

                }

            }

        }

        //播放

        public void play()
        {

            TemStr = "";

            TemStr = TemStr.PadLeft(127, Convert.ToChar(" "));

            APIClass.mciSendString("play media", TemStr, TemStr.Length, 0);

            mc.state = State.mPlaying;

        }

        //停止

        public void StopT()
        {

            TemStr = "";

            TemStr = TemStr.PadLeft(128, Convert.ToChar(" "));

            ilong = APIClass.mciSendString("close media", TemStr, 128, 0);

            ilong = APIClass.mciSendString("close all", TemStr, 128, 0);

            mc.state = State.mStop;

        }



        public void Puase()
        {

            TemStr = "";

            TemStr = TemStr.PadLeft(128, Convert.ToChar(" "));

            ilong = APIClass.mciSendString("pause media", TemStr, TemStr.Length, 0);

            mc.state = State.mPuase;

        }

        private string GetCurrPath(string name)
        {

            if (name.Length < 1) return "";

            name = name.Trim();

            name = name.Substring(0, name.Length - 1);

            return name;

        }

        //总时间

        public int Duration
        {

            get
            {

                durLength = "";

                durLength = durLength.PadLeft(128, Convert.ToChar(" "));

                APIClass.mciSendString("status media length", durLength, durLength.Length, 0);

                durLength = durLength.Trim();

                if (durLength == "") return 0;

                return (int)(Convert.ToDouble(durLength) / 1000f);

            }

        }
        //当前时间
        public int CurrentPosition
        {

            get
            {

                durLength = "";

                durLength = durLength.PadLeft(128, Convert.ToChar(" "));

                APIClass.mciSendString("status media position", durLength, durLength.Length, 0);

                mc.iPos = (int)(Convert.ToDouble(durLength) / 1000f);

                return mc.iPos;
            }
        }
    }
    public class APIClass
    {

        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]

        public static extern int GetShortPathName(

        string lpszLongPath,

        string shortFile,

        int cchBuffer

        );

        [DllImport("winmm.dll", EntryPoint = "mciSendString", CharSet = CharSet.Auto)]

        public static extern int mciSendString(

        string lpstrCommand,

        string lpstrReturnString,

        int uReturnLength,

        int hwndCallback

        );

    }

}

调用也非常简单:

   private void button3_Click(object sender, EventArgs e)
        {
            AudioPlayer cm = new AudioPlayer ();
            cm.FileName =@"D:/mp3222.mp3";
            cm.play();
        }        

注意:

1、这种方式支持mp3格式,其余的格式没有测试。

2、在AudioPlayer类中,通过APIClass.GetShortPathName(mc.iName, Name, Name.Length)方法根据长路径获得短路径,但这种方法不能获得服务器的短路径,所以,目前不知道根据这种方法播放服务器端的文件。但是可以通过将服务器端的文件加载的本地,在通知这种方式来播放本地文件。

总结:这三种方法都没法实现amr文件的播放,可以通过第三方插件(libvlc播放器是个不错的选择)的方式实现,但没有深入研究过,有大神也可以知道下,至今播放amr文件没有很好的解决方案。因为手机上传过来的文件,大多是amr文件。

  

原文地址:https://www.cnblogs.com/panbin/p/5534134.html