在Chrome中使用HTML5音频更改<source>可以正常工作,但在Safari中无法正常工作

3
我正在尝试创建一个HTML5音频播放列表,以便在每个主要浏览器中都能正常工作:Chrome、Safari、Firefox、IE9+。然而,我无法找到一种跨浏览器兼容的方式来更改源代码。 更新 例如,更改<source>标签的src在Chrome中有效,但在Safari中无效。虽然@eivers88下面的解决方案使用canPlayType有效,但我认为直接更改<source>标签的src更容易。有人能解释一下为什么我的代码在Chrome中有效但在Safari中无效吗?
JS:
var audioPlayer=document.getElementById('audioPlayer');
var mp4Source=$('source#mp4');
var oggSource=$('source#ogg');
$('button').click(function(){    
  audioPlayer.pause();
  mp4Source.attr('src', 'newFile.mp4');
  oggSource.attr('src', 'newFile.ogg');
  audioPlayer.load();
  audioPlayer.play();
});

HTML:

<button type="button">Next song</button>
<audio id="audioPlayer">
  <source id="mp4" src="firstFile.mp4" type="audio/mp4"/> 
  <source id="ogg" src="firstFile.ogg" type="audio/ogg" />                      
</audio>

在按钮点击后检查HTML代码,<source src=""/> 在Safari浏览器中确实发生了更改,只是HTTP请求没有被发出,因此文件没有被load()play()。对此有任何想法的人吗?

3个回答

5
这里有一个可用的示例。它跟你们的有些不同,但希望它能对你们有所帮助。
HTML:
<button type="button">Next song</button>

JavaScript/jQuery:

    var songs = [
    '1976', 'Ballad of Gloria Featherbottom', 'Black Powder' 
]
var track = 0;
var audioType = '.mp3'
var audioPlayer = document.createElement('audio');

$(window).load(function() {

    if(!!audioPlayer.canPlayType('audio/ogg') === true){
        audioType = '.ogg' //For firefox and others who do not support .mp3
    }

    audioPlayer.setAttribute('src', 'music/' + songs[track] + audioType);
    audioPlayer.setAttribute('controls', 'controls');
    audioPlayer.setAttribute('id', 'audioPlayer');
    $('body').append(audioPlayer);
    audioPlayer.load();
    audioPlayer.play();

});

$('button').on('click', function(){
    audioPlayer.pause();
    if(track < songs.length - 1){
        track++;
        audioPlayer.setAttribute('src', 'music/' + songs[track] + audioType);
        audioPlayer.load();
        audioPlayer.play();
    }
    else {
        track = 0;
        audioPlayer.setAttribute('src', 'music/' + songs[track] + audioType);
        audioPlayer.load();
        audioPlayer.play();
    }
})

这就是为什么我添加了 if(!!audioPlayer.canPlayType('audio/mp3') === true) 语句,如果它是假的,你可以添加一个 else { audioType = '.ogg' },然后将 audioType 变量更改为 .ogg。 - eivers88
@timpeterson - 对不起,我应该一开始就让它在所有浏览器上兼容,现在应该可以正常工作了。 - eivers88
-@eivers,谢谢。我正在尝试在我的本地主机上复制你的代码。唯一的问题是,因为我是用JavaScript创建音频元素,它不知道内容头是什么,所以它认为mime-type="text/html"。这是错误信息:"HTTP "Content-Type" of "text/html" is not supported. Load of media resource http://localhost/uploads/9/v1/Miaow-02-Hidden.ogg failed." 有什么想法吗? - tim peterson
@timpeterson 我有点困惑,你是否将你的js代码包裹在<script type="text/javascript"></script>标签中? - eivers88
哦,天啊!我只是把这些文件所在文件夹的名称拼错了。唉!!!问题解决了。现在在Safari、Chrome和Firefox中都可以播放了。感谢你们的帮助! - tim peterson
显示剩余10条评论

1

出于某些原因,Safari无法使用<source>标记在歌曲之间进行切换,但Chrome可以。只需要更改<audio>标签上的src属性加载内容就可以在Chrome和Safari上工作,但是存在ogg与mp3的问题。

我猜解决ogg与mp3的问题的一种方法是使用Modernizr进行特性检测,以在Firefox中加载ogg mime-type,在Chrome / Safari中加载mp3。这里有一个相关参考:用Modernizr检测html5音频支持


0

关于主题的一个快速补充(在2023年):

我遇到了类似的问题。代码在Safari中可以运行,但在Chrome中无法运行。 我有一段JavaScript代码,用于交换<source>元素的src。在Safari中这很好用,但是Chrome拒绝识别该文件并显示禁用的播放器状态。我错过了什么,也从这里学到了,就是你还需要调用load()

所以添加这个对我有帮助。

audioPlayer.load();

Safari 似乎可以自动检测源代码的更改,但 Chrome 却不能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接