各位大侠:小弟为新手,初来乍到,还请多多关照!
问题如题:我想做一个后台播放音频文件的程序。不知该如何做?

解决方案 »

  1.   

    方法有很多种,这里只贴一种我在用的
    using System;   
    using System.Runtime.InteropServices;    
    using System.Text;    
    using System.IO ;
    namespace Kkun.Util {
        /// <SUMMARY>   
        /// clsMci 的摘要说明。   
        /// </SUMMARY>   
        public class Mp3Player {
            public Mp3Player() {
                //   
                // 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(Exception exp) {
                        Log.Error(exp);
                        //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
            );
        }
    }使用时
    public static void Play(string file) {
                Mp3Player mp3 = new Mp3Player();
                mp3.FileName = file;
                mp3.play();
            }
      

  2.   

    实现 ExoBUD 网站媒体播放器的互动
    原创作者:寒羽枫(cityhunter172) 一、下载 ExoBUD 网站媒体播放器            ExoBUD 是一款不错的网站媒体播放器,但它全是静态页面与脚本,有位网友在 QQ 上叫我帮忙改一下。现把改好的部分拿出来,大家一起分享。播放器下载网址:http://jc.k688.com/Soft/ShowClass.asp?ClassID=7  ,本文示例用的是 ExoBUD MP(II) v4.1sc+ Winamp 5 Ⅰ 面板:http://jc.k688.com/Html/Soft/player/27.shtml (若无法下载,大家就搜索一下吧)
                声明:本文只针对 ExoBUD 另行编写能够进行查询的页面,ExoBUD 版权归原作者
    二、播放器基本原理         仔细查看下载的 ExoBUD 源码,原作者将播放清单存放在 “exobudpl.js”。此文件说是播放清单,其实只是添加播放曲目的脚本运行语句。虽然我们可以使用 .aspx 页面生成动态的 .js 脚本让 IE 引用,但这样显然不是我们想要的。
             ExoBUD 真正的播放清单是一脚本变量—— objMmInfo ,它是数组类型,只要对它进行修改,就可决定播放器的清单了。三、创建拥有查询功能的播放清单1、在 exobud.htm 中注释掉“exobudpl.js”的引用。<!-- 载入 ExoBUD MP(II) 播放列表设定文件 
    <script language="JavaScript" src="exobudpl.js"></script>-->
    2、修改 exobud.js 中,打开播放清单的函数。
    // openPlist() 函式: 以弹出视窗显示播放列表内容
    function openPlist()...{
     window.open("PlayList.aspx","mplist","top=120,left=320,width=400,height=480,scrollbars=no,resizable=yes,copyhistory=no");
    }
    3、编写播放清单页面(PlayList.aspx)。<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>音乐播放列表</title>
    <script language="JavaScript" type="text/javascript">...
    <!--
    var via = opener;
    var arrMain = via.objMmInfo;    //播放器的播放列表
    var arrNewItems = new Array();  //清代新增的播放文件
    var arrDelItems = new Array();  //存放需要删除的播放文件
    var ck_Select;                  //多个复选框//单击复选时触发的事件
    function SelectItems(obj)
    ...{
        RemoveItem(arrNewItems,obj.value); //根据 value 移除
        RemoveItem(arrDelItems,obj.value);
        if(obj.checked)
        ...{
            arrNewItems.push(obj);        //若是选中则加入 arrNewItems
        }
        else
        ...{
            arrDelItems.push(obj);        //若未选中则加入 arrDelItems
        }
    }//保存播放列表
    function SavePlayList()
    ...{
        arrMain = via.objMmInfo;
        if(arrMain == null)              //当前列表没有任何东东
        ...{
            for(var i =0; i<arrNewItems.length;i++)
            ...{
                var val = arrNewItems[i].value.split(" ");
                via.mkList(val[0],val[1]);  //调用 exobud.js 中的函数——将用户选中的加入播放列表
            }
            via.mkSel(); //调用 exobud.js 中的函数——建立已选取播放项目(Selected Media)的阵列
            via.mkAct(); //调用 exobud.js 中的函数——建立已启用播放项目(Activated Media)的阵列
            return;
        }
        for(var i =0; i<arrDelItems.length;i++) //从列表中删除用户去掉勾选的文件
        ...{
            var val = arrDelItems[i].value.split(" ");
            for(var j =0; j < arrMain.length;j++)
            ...{
                if(val[0]==arrMain[j].mmUrl)        //value 中的 path 与列表中的 mmUrl 相同
                ...{
                    arrMain.splice(j,1);            //从列表中移除该项
                    via.intMmCnt = arrMain.length;  //此句不能少
                    break;
                }
            }
        }
        for(var i =0; i<arrNewItems.length;i++) //将用户勾选的文件新增至列表中
        ...{
            var val = arrNewItems[i].value.split(" ");
            var isNew = true;
            for(var j =0; j < arrMain.length;j++)
            ...{
                if(val[0]==arrMain[j].mmUrl)        //value 中的 path 与列表中的 mmUrl 相同,说明存在该文件
                ...{isNew=false;break;}
            }
            if(isNew)
            ...{
                via.mkList(val[0],val[1]);      //列表中若不存在,则加入列表
            }
        }
        via.mkSel();    //调用 exobud.js 中的函数
        via.mkAct();
    }
    //清空播放列表
    function ClearPlayList()
    ...{
        SettingChecked('CB_Selected',false);
        if(via.intMmCnt > 0)...{via.wmpStop();}   //调用 exobud.js 中的函数——停止播放曲目及显示「就绪」状态讯息
        via.objMmInfo = null;
        via.intMmCnt = 0 ;
        arrMain = via.objMmInfo;
        arrNewItems = new Array();  //清空数组
        arrDelItems = new Array();  //清空数组
    }//播放当前列表
    function PlayingList()
    ...{
         SavePlayList();
         via.wmpStop();    //调用 exobud.js 中的函数——停止播放曲目及显示「就绪」状态讯息
         via.startExobud();    //调用 exobud.js 中的函数—— 开始播放曲目
         self.close();
    }//页面加裁成功后执行
    function WebLoaded()
    ...{
        if(arrMain == null)...{return;}
        ck_Select = document.getElementsByName("CB_Selected");
        for(var i =0; i<ck_Select.length;i++)
        ...{
            for(var j =0; j < arrMain.length;j++)
            ...{
                var val = ck_Select[i].value.split(" ");
                if(val[0]==arrMain[j].mmUrl)        //value 中的 path 与列表中的 mmUrl 相同,说明列表中存在该文件
                ...{
                    ck_Select[i].checked=true;      //选中此 CheckBox
                    arrNewItems.push(ck_Select[i]); //加入 arrNewItems
                }
            }        
        }
    }//根据 value 移除相应的项目
    function RemoveItem(arr,val)
    ...{
        for(var j =0; j < arr.length;j++)
        ...{
            if(arr[j].value == val)
            ...{
                arr.splice(j,1); 
                return;
            }
        }    
    }//设置 CheckBox 的选择状态
    function SettingChecked(name,isCked)
    ...{
        var objs = document.getElementsByName(name);
        for(var i = 0; i < objs.length;i++ )
        ...{
            if(isCked == null)  //若为 null ,则为反选
            ...{
                objs[i].checked = !objs[i].checked;
            }
            else
            ...{
                objs[i].checked = isCked;
            }
        }
    }
    //-->
    </script>
    </head>
    <body onload="WebLoaded()" style="background-color: #deefff;text-align:center">
        <form id="form1" runat="server">
        <div>    
           <strong>音乐播放列表</strong>
           <br />
           <asp:TextBox ID="Txt_Keywords" runat="server">请输入关键字进行搜索</asp:TextBox>
           <asp:Button  runat="server" ID="Btn_Search" OnClick="Btn_Search_Click" Text="搜索"/>
            <div style="text-align: left">
            <input type="button" value="全选" onclick="SettingChecked('CB_Selected',true)"/>
            <input onclick="SettingChecked('CB_Selected',false)" type="button" value="全否" />
            <input onclick="SettingChecked('CB_Selected')" type="button" value="反选" />
            </div>
            <br />         <asp:GridView ID="GV_List" runat="server" Width="100%"  AutoGenerateColumns="False">
              <Columns>
                 <asp:TemplateField HeaderText="选择">
                      <HeaderStyle Wrap="False" Font-Size="Small" />
                      <ItemStyle Wrap="False" Font-Size="Small" />
                     <ItemTemplate >
                     <input name="CB_Selected" onclick="SelectItems(this);"
                         type="checkbox" value="<%#this.ResolveUrl(((System.Data.DataRowView)Container.DataItem)["urlPath"].ToString())+"\t"+System.IO.Path.GetFileNameWithoutExtension(((System.Data.DataRowView)Container.DataItem)["MusicName"].ToString()) %>"/>
                     </ItemTemplate>
                        </asp:TemplateField>
                            <asp:BoundField DataField="MusicName" HeaderText="歌曲名称" >
                                <ItemStyle Font-Size="Small" HorizontalAlign="Left" />
                                <HeaderStyle Font-Size="Small" />
                            </asp:BoundField>
            </Columns>
            <HeaderStyle Font-Size="Small" />
           </asp:GridView>
            <br />     <input onclick=" ClearPlayList()" type="button" value="清空列表" />  
         <input onclick=" SavePlayList()" type="button" value="保存列表" />   
         <input type="button" value="播放当前列表" onclick="PlayingList()"/>
        <input id="btnClose" type="button" value="关闭" onclick="self.opener=null;self.close()" />
        <br />
        </div>
        </form>
    </body>
    </html>
             需要注意的是用于绑定的字串 ["urlPath"] 与 ["MusicName"] 是数据源(DataSource)中的字段,各位自行修改。
    上例中使用 " \t " 对文本进行分隔,
    前半部分 ["urlPath"] :播放器能够找到的绝对或是相对的 URL 路径,具有唯一性
    后半部分 ["MusicName"] :显示在播放器中的字幕,可随意修改,上例用的是去除后缀的文件名四、上述播放清单页面(PlayList.aspx)操作说明1、输入关键字 → 点击“搜索”按钮(分页功能请自行编写)。2、在查询结果中,若存在当前的播放清单中的 urlPath ,页面会自动勾选上此笔记录。3、去掉勾选,点击“保存”或“播放当前”按钮后,将从播放清单中删除该笔记录。4、对于新增的勾选,点击“保存”或“播放当前”按钮后,则追加至播放清单,原列表不受影响