读书人

关于C#中音频播放API函数的有关问题

发布时间: 2012-04-09 13:41:25 作者: rapoo

关于C#中音频播放API函数的问题!

C# code
 public class clsMCI    {        public clsMCI()        {            //            // 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                {                    MessageBox.Show("出错错误!");                }            }        }        //播放        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        );    } 



这是我在网上查到的一个音乐播放的类。API函数由于以前没接触过。还请高手具体分析一下这个函数。

还有,在用这个累的函数时只能播放一个文件,当再次改一个名字调用play时就不可以了。对此怎样改才能向平时的播放器一样,实现暂停和停止呢??

坐等回答!!

[解决办法]
c#播放音频文件
首先将C:\WINDOWS\system32下的wmp.dll应用到项目中;

WMPLib.WindowsMediaPlayerClass player = new WMPLib.WindowsMediaPlayerClass();
player.URL = @"F:\ding.wav";
player.uiMode = "None";
player.settings.volume = 100;
player.settings.playCount = 1;
player.play();

WMPLib.WindowsMediaPlayer 的用法



属性/方法名: 说明:
[基本属性]  
URL: String; 指定媒体位置,本机或网络地址
uiMode:String; 播放器界面模式,可为Full, Mini, None, Invisible
playState:integer; 播放状态,1=停止,2=暂停,3=播放,6=正在缓冲,9=正在连接,10=准备就绪
enableContextMenu:Boolean; 启用/禁用右键菜单
fullScreen:boolean; 是否全屏显示
[controls] wmp.controls //播放器基本控制
controls.play; 播放
controls.pause; 暂停
controls.stop; 停止
controls.currentPosition:double; 当前进度
controls.currentPositionString:string; 当前进度,字符串格式。如“00:23”
controls.fastForward; 快进
controls.fastReverse; 快退
controls.next; 下一曲
controls.previous; 上一曲
[settings] wmp.settings //播放器基本设置
settings.volume:integer; 音量,0-100
settings.autoStart:Boolean; 是否自动播放
settings.mute:Boolean; 是否静音
settings.playCount:integer; 播放次数
[currentMedia] wmp.currentMedia //当前媒体属性
currentMedia.duration:double; 媒体总长度
currentMedia.durationString:string; 媒体总长度,字符串格式。如“03:24”
currentMedia.getItemInfo(const string); 获取当前媒体信息"Title"=媒体标题,"Author"=艺术家,"Copyright"=版权信息,"Description"=媒体内容描述,"Duration"=持续时间(秒),"FileSize"=文件大小,"FileType"=文件类型,"sourceURL"=原始地址
currentMedia.setItemInfo(const string); 通过属性名设置媒体信息
currentMedia.name:string; 同 currentMedia.getItemInfo("Title")
[currentPlaylist] wmp.currentPlaylist //当前播放列表属性
currentPlaylist.count:integer; 当前播放列表所包含媒体数
currentPlaylist.Item[integer]; 获取或设置指定项目媒体信息,其子属性同wmp.currentMedia

循环播放:currentMedia.settings.setMode("loop", true);

取消循环:currentMedia.settings.setMode("loop", false);


[解决办法]
指示MCI命令执行结果,是一个错误代码,如果出错可以根据这个代码查询错误原因,

探讨
追问一下 ,那个ilong 变量是干什么用的?

读书人网 >C#

热点推荐