(译)html5中一个简单mp3播放器的audio标签回退比你想象的要难

我已经花了好几个晚上和周末来重新设计博客和Hanselminutes podcast站点。这些年我都 

没意识到这个播放站有多棒。我想以后能扩宽受众群体,目前的收听关系有点扁平。现在我
在给这个站点过去六年里所有的360多人添加头像。

非常感谢来自Portland Girl Geek Dinners的Lynsey Smith,顺便说一下,她很努力的为我
寻找图片!

我还希望有更好的浏览器内置音频体验,所以假定我已经加了audio标签并且完成了,对吧?

这个html5的audio标签不错吧?这样就行了,梦寐以求啊:
<audio id="audioplayer" preload="metadata" type="audio/mp3" >
<source src="http://s3.amazonaws.com/hanselminutes/hanselminutes_0363.mp3"
type="audio/mp3"/>
Your browser doesn't support the HTML audio tag. Be sad.
</audio>

如果你喜欢,可以到http://jsfiddle.net/CdxbX/来试一下。

没有比这更容易的了。

这是在IE9+中看到的:

chrome中:

firefox,version19:

呃,firefox现在还不支持MP3的audio标签,所以它只是闪了一下就消失了。firefox很快就
会在audio标签中支持MP3了,虽然是用操作系统底层来播放流文件而不是自己的内置代码。

在windows 7及后续操作系统上运行的firefox20(beta版),你可以在about:config中设置
media.windows-media-foundation.enabled来测试MP3音频的支持情况。

让我失望的是html5有很多规范问题,你可以注意到我在上面的代码中添加了回退文本,但在
firefox中看不到。因为回退的元素只有在你的浏览器根本不支持audio标签的时候才会用到

这根本不是我想要的。我想要的是“可以支持这些音频吗?不行?那就回退”。对我来说这
比较直观。

我通过在Mozilla工作的Christian Heilmann和Chris Double谈了这个问题,他说,“你要把
这个问题向上抛到WHATWG/W3C。之前已经有过争论。”确实有问题,从2009年10月开始就有
很多人说这样回退不直观:

我期望的(在这里不正确)是如果我只放了一个源元素(一个MP4),firefox会用下面的回
退内容,像这样的话如果我包含一个不被支持格式的对象元素(比如,如果我包含一个没安
装的QuickTime对象,用户会看到回退内容)。我看这种情况下唯一的选择是依靠javascript
和video元素的canPlayType()函数--Kit Grose

缺少直观的回退意味着我无法仅仅用html来制作普遍适用的音频播放器,我只能选择使用
javascript了,对于这种基础的事情来说,用javascript来写有点无赖了。

让html5的音频在所有浏览器中正确回退

你要用javascript动态创建一个audio标签,然后审查这个标签,看看它是不是适用于所有
video。最后,我贴上从我朋友Matt Coneybeare那弄来的代码。
<audio id="audioplayer" preload controls loop>
<source src="audio.mp3">
</audio>
<script type="text/javascript">
var audioTag = document.createElement('audio');
if (!(!!(audioTag.canPlayType) && ("no" != audioTag.canPlayType
("audio/mpeg")) && ("" != audioTag.canPlayType("audio/mpeg")))) {
AudioPlayer.embed("audioplayer", {soundFile: "audio.mp3"});
}
</script>

后面呢,我放一个从WordPress Audio Player搞来的独立的音频播放器,这样在firefox中当
canPlayType函数返回false的时候,就有个flash播放器做替代了。

html5中,一个可响应并且触感好的音频播放器

不管怎么说,audio标签默认制作出来的音频播放器实在是有点挫,而我希望它更好的支持触
摸,在平板上看起来更棒等等,为此,我转向Osvaldas Valutis的播放器。这是个很好的
jQuery小插件,它把audio标签元素替换成一个可爱的html块。其实你无法真正改变html5的
audio标签元素样式,人们只是隐藏它,重建它,然后重建的再去调用隐藏但还工作的audio
元素。

这个插件,配上少许渲染默认颜色的css代码,给我带来一个很棒的看起来一模一样的音频播
放器,而且普遍可用。除了在firefox 19/20中,要等到canPlayType函数返回true的时候才
可用!在此之前,用的是flash的回退播放器,用着也不错。

另一个问题是很多firefox用户都安装的QuickTime插件。当渲染Osvaldas的播放器时,
javascript审查有时可能会让firefox浏览器提醒大家没安装它的请安装,而安装后播放器还
是没用。
最后我对Matt的代码小小的修改了下,让它支持生成Osvaldas播放器。我发现代码更加动态
,所用元素更少,不过这让我阅读起来更容易。

首先,试着用audio标签。有用?很好,生成播放器;
不支持MP3音频?动态生成一个flash的播放器。隐藏音频播放器(好像不需要)

代码可读性悲剧了,有用来渲染html的".audioPlayer" jQuery插件,还有内嵌
的"AudioPlayer"flash。他们是不同的,可是名字一样。我还没修改过。

<audio id="audioplayer" preload="auto" controls style="100%;" >
<source src="your.mp3" type="audio/mp3">
Your browser doesn't support the HTML audio tag. You can still download
the show, though!
</audio>
<p id="audioplayer_1"></p>
<script type="text/javascript">
var audioTag = document.createElement('audio');
/* Do we not support MP3 audio? If not, dynamically made a Flash SWF player.
*/
if (!(!!(audioTag.canPlayType) && ("no" != audioTag.canPlayType
("audio/mpeg")) && ("" != audioTag.canPlayType("audio/mpeg")))) {
AudioPlayer.embed("audioplayer_1", {soundFile: "your.mp3",
transparentpagebg: "yes"});
$( '#audioplayer').hide();
}
else /* Ok, we do support MP3 audio, style the audio tag into a touch-
friendly player */
{
/* If we didn't do the "if mp3 supported" check above, this call would
prompt Firefox install quicktime! */
$( '#audioplayer' ).audioPlayer();
}
</script>

总之,目前为止很好用。

奇怪的bug:当我的站点加载评论的时候,播放器被阻止了,chrome看起来似乎挂了。有
javascript专家想说两句的吗?如果加载一个页面,就像这个-在页面加载完成之前点击播放
器,音频没有放出来,只是在chrome中这样。有想法不?

看到这,考虑下订阅 http://hanselminutes.com吧!It's "Fresh Air for Developers."

译自:http://www.hanselman.com/blog/FallbackHTML5AudioTagsForASimpleMP3PodcastAreHarderThanYoudThink.aspx

原文地址:https://www.cnblogs.com/ongoing/p/2991055.html