各位大侠:小弟为新手,初来乍到,还请多多关照!
问题如题:我想做一个后台播放音频文件的程序。不知该如何做?
问题如题:我想做一个后台播放音频文件的程序。不知该如何做?
解决方案 »
- MP3播放器中部分代码看不懂,求解
- 请教大家,根据属性节点获取元素节点,应该怎么获取,XML。
- 我如果在其他机器上装了.net freamwork 2.0,是不是我做的VS2005的程序就可以在别的机器上运行了啊
- 一个很奇怪的问题。。。SQL 语句 LIKE '%20%' 的问题
- 网络的远程启动问题 (ASP)
- 未将对象引用设置到对象的实例
- 如何在WebService中使用SSL证书?(顶者有分)
- winform datagridview 一个单元格里多个链接,怎么实现?
- 50分,请高手给一些在windows2003系统下用.net开发构架voip服务端和客户端的资料
- ACCESS数据库图片更新的问题(有经验者进)
- c# winfrom部署安装项目?
- 将panel空间及其包含的空间转化成图片
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();
}
原创作者:寒羽枫(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、对于新增的勾选,点击“保存”或“播放当前”按钮后,则追加至播放清单,原列表不受影响