经过查阅资料,实现网页音乐播放器大致有以下三种方式:
- Windows Media Player
- Flash Player
- HTML5 Audio
下面将就每一种实现方式及 API 做详细阐述:
1、通过 Windows Media Player 方式
以下是来自百度百科的解释:
Windows Media Player是微软公司出品的一款免费的播放器,属于Microsoft Windows的一个组件,通常简称"WMP",支持通过
插件增强功能。
Windows Media Player播放器只能播放微软自家的MP3、WMA、WAV等格式,当然现在可以通过安装一些解码器来增强WMP的播放格式。
显然,Windows Media Player 的缺点是显而易见的,比如只能运行在 Windows 平台下,支持的文件格式有限等。
用过网页版 QQ空间 的小伙伴应该经常会遇到,在 IE浏览器 的底部,会出现一个 ActiveX 控件加载的提示,表示当前网页需要运行 ActiveX 控件以提升用户体验。
ActiveX插件也叫做OLE控件或OCX控件,它是一些软件组件或对象,可以将其插入到WEB网页或其它应用程序中。在因特网上,ActiveX插件软件的特点是:一般软件需要用户单独下载然后执行安装,而ActiveX插件是当用户浏览到特定的网页时,IE浏览器即可自动下载并提示用户安装。
ActiveX插件安装的前提是必须先下载,然后经过认证,最终用户确认同意方能安装,因此嵌有ActiveX脚本程序的页面可能会变得非常慢,甚至导致浏览器瞬间失去响应。
笔者找到了 QQ空间 用来播放音乐的插件 QzoneMusicInstall.exe,由于笔者对这种 exe 文件不是太懂,所以直接跳过。
下面将用代码来示范如何在网页中插入 Windows Media Player 播放器:
1、判断是否是 IE 浏览器
var isIE = !!window.ActiveXObject;
2、工具函数,用来在某个容器元素下追加节点
function createElementIn(type, containerId, doc) {
var _doc = doc || document,
element;
var container = _doc.getElementById(containerId);
element = _doc.createElement(type);
container.appendChild(element);
return element
}
3、插入 Windows Media Player 播放器到指定 id 的容器元素下:
function insertMediaPlayer(args) {
var params = {};
var objAttrs = {};
for (var k in args) switch (k) {
case "style":
case "height":
case "width":
case "id":
case "src":
objAttrs[k] = args[k];
break;
default:
params[k] = args[k]
}
if (args["src"]) params["src"] = args["src"];
var str = [];
str.push("<object ");
if (isIE) str.push('classid="clsid:6BF52A52-394A-11D3-B153-00C04F79FAA6" ');
else str.push('type="application/x-ms-wmp" ');
for (var i in objAttrs) {
str.push(i);
str.push('="');
str.push(objAttrs[i]);
str.push('" ')
}
str.push(">");
if (isIE)
for (var i in params) {
str.push('<param name="');
str.push(i);
str.push('" value="');
str.push(params[i]);
str.push('" /> ')
}
str.push("</object>");
var playerDiv = createElementIn("div", "wm_control");
playerDiv.innerHTML = str.join("");
return playerDiv.firstChild
}
可以发现,IE 需要使用 classid 属性声明,而其他浏览器则需要使用 type 属性声明。
var wmPlayer = insertMediaPlayer({
id: "wmplayer",
height: 0,
width: 0,
autoStart: "false",
invokeURLs: "false",
uiMode: "invisible",
enablePositionControls: "true",
canScan: "true",
canSeek: "true"
})
执行上面的代码后,在 IE浏览器 下将得到形如下面的元素:
<object classid="clsid:6BF52A52-394A-11D3-B153-00C04F79FAA6" id="wmplayer" height="0" width="0">
<param name="autoStart" value="false">
<param name="invokeURLs" value="false">
<param name="uiMode" value="invisible">
<param name="enablePositionControls" value="true">
<param name="canScan" value="true">
<param name="canSeek" value="true">
</object>
而在其他浏览器下则是这样的:
<object type="application/x-ms-wmp" id="wmplayer" height="0" width="0"></object>
以下是 一些 param 以及对应的 value 值的说明:
<param name="URL" value="" /> // 媒体文件地址
<param name="rate" value="1" />
<param name="balance" value="0" /> // 声道 0全声道,-100左声道,100右声道
<param name="currentPosition" value="0" />
<param name="playCount" value="1" /> // 播放次数
<param name="autoStart" value="-1" /> // 是否自动播放 -1 是,0 否
<param name="currentMarker" value="0" />
<param name="invokeURLs" value="-1" />
<param name="volume" value="50" /> // 音量
<param name="mute" value="0" />'); // 是否静音 -1 是,0 否
<param name="uiMode" value="none" /> // 播放器模式 full(默认) 显示全部控件,none 仅视频窗口,mini 视频及一些常用控件,invisible 不显示任何控件及视频窗口
<param name="stretchToFit" value="0" />
<param name="windowlessVideo" value="0" />
<param name="enabled" value="-1" />');
<param name="enableContextMenu" value="-1" />
<param name="fullScreen" value="0" />'); // 是否全屏
<param name="enableErrorDialogs" value="-1" /> // 是否允许出错信息提示
JavaScript 与播放器交互(注意区分大小写)
wmPlayer.URL = "" // 播放媒体地址
wmPlayer.controls.play() // 开始播放
wmPlayer.controls.stop() // 停止播放
wmPlayer.controls.pause() // 暂停播放
wmPlayer.settings.mute = true | false // 控制是否静音
wmPlayer.fullScreen = true | false // 控制是否全屏
wmPlayer.playState // 播放机状态, 共有 1-10 个状态, 具体如下
wmPlayer.playState == 1 // 停止播放
wmPlayer.playState == 2 // 暂停播放
wmPlayer.playState == 3 // 正常播放
wmPlayer.playState == 4 // 向前搜索
wmPlayer.playState == 5 // 向后搜索
wmPlayer.playState == 6 // 缓冲处理
wmPlayer.playState == 7 // 等待反应
wmPlayer.playState == 8 // 播放完毕
wmPlayer.playState == 9 // 连接媒体
wmPlayer.playState == 10 // 准备就绪
wmPlayer.controls.currentPositionString // 取得媒体当前位置,以形如 06:01 的时间形式显示
wmPlayer.controls.currentPosition // 获取或设置媒体当前位置,以形如 300.001 的秒数形式显示,精确到毫秒
wmPlayer.currentMedia.durationString // 取得媒体总长度,以形如 06:01 的时间形式显示
wmPlayer.currentMedia.duration // 取得媒体总长度,以形如 300.001 的秒数形式显示,精确到毫秒
2、通过 Flash 的方式
敬请期待,下期分解!
3、通过 HTML5 提供的新标签 Audio
敬请期待,下期分解!
考虑到要讲清楚每一种实现方式,内容会有点多,以及文章篇幅问题,故把对于余下两种实现方式的分析阐述和本期分开。如果您对内容感兴趣或者觉得内容还不错,欢迎点赞或者 star 我。
感谢您花费时间阅读我的文章!