• .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文件。

      

  • 相关阅读:
    蓝牙接收苹果手机通知 ANCS协议分析
    sqlite索引的原理
    iOS 项目的编译速度提高
    苹果核
    如何将 iOS 工程打包速度提升十倍以上
    微信跳一跳 (亲测可用)
    iOS 11 适配集锦
    iOS端Mock GPS定位 —— 测试、开发、玩游戏、发朋友圈等等,你都用得上(转)
    架构、框架、模式、模块、组件、插件、控件、中间件的含义和区别
    OC基础--对象做参数在方法间传递
  • 原文地址:https://www.cnblogs.com/panbin/p/5534134.html
Copyright © 2020-2023  润新知