问题 Safari音频标签不起作用


我使用这个简单的代码处理HTML5音频标签:

HTML

<audio id="audioFrenata">
<source src="sounds/frenata.ogg">
<source src="sounds/frenata.mp3"></audio>

JS

$('#audioFrenata').on('ended', function() {
        manageImageObjectsLevel();
    }).get(0).play();

使用Chrome,这可以正常工作,Windows上的Safari 5.1.7和iPad 3上的Safari我收到:

'undefined' is not a function (evaluating '$('#audioFrenata').on('ended', function() {
manageImageObjectsLevel();
}).get(0).play()')

任何人都知道为什么?


9143
2017-10-09 16:05


起源

认为 undefined 是指 stop() 因为在stop中不是DOMNode上的函数 #audioLevel。 ( document.getElementById("audioLevel").stop === undefined ) - andlrc
停止的地方??你指的是'已结束'事件,即使我消除它并且只尝试调用播放它会给出同样的错误.. - Matteo Ciman
@Matteo,你找到了这个问题的解决方案吗? - Lasse Christiansen
还没有..我还在努力.. - Matteo Ciman


答案:


我遇到了完全相同的问题,我发现它是由于Safari中的以下限制:

在iOS上的Safari(适用于所有设备,包括iPad),用户所在的位置 也许 在蜂窝网络上并按数据单元收费, 预加载和自动播放被禁用在用户启动数据之前,不会加载任何数据。 这意味着JavaScript play()和load()方法在用户启动回放之前也处于非活动状态,除非用户操作触发play()或load()方法。换句话说,用户启动的播放按钮可以工作,但onLoad =“play()”事件不起作用。

参考: http://developer.apple.com/library/safari/#documentation/AudioVideo/Conceptual/Using_HTML5_Audio_Video/Device-SpecificConsiderations/Device-SpecificConsiderations.html

解决问题的一种方法是默认静音,当用户“取消静音”时,您可以创建HTML5 Audio对象的实例并将其存储在“静态”/“全局”变量中,并将其用于进一步回放。

- 更新

这是一篇博客文章,描述了该问题以及如何处理它: http://blog.gopherwoodstudios.com/2012/07/enabling-html5-audio-playback-on-ios.html

这是一个类似的stackoverflow问题,讨论同样的事情: 使用HTML5在iPad上自动播放音频文件

以下是我编写的用于处理HTML5中音频播放的JavaScript“模块”:

NS.modules.html5.audio = (function () {

    var _snd = false;

    function playAudio(src) {
        if (!_snd)
            _snd = new Audio();
        else
            $(_snd).empty();

        for (var i = 0; i < src.length; i++) {
            var source = document.createElement('source');
            source.type = src[i].type;
            source.src = src[i].src;
            _snd.appendChild(source);
        }

        _snd.load(); // Needed on safari / idevice
        _snd.play();
    };

    var playAudio = function () {
        var src = [
            { src: "/path/to/audio.wav", type: "audio/vnd.wave" },
            { src: "/path/to/audio.ogg", type: "application/ogg; codecs=vorbis" },
            { src: "/path/to/audio.mp3", type: "audio/mpeg" }
        ];
        playAudio(src);
    };

    return {
        playAudio: playAudio,
        // more play functions here
    };
})();

11
2017-10-09 16:42



哇!!!很好,是的移动浏览器不会自动下载/播放音频文件。对于我制作的节拍器应用程序,我必须从关闭声音开始,当用户单击/按下声音图标(我必须最初禁用)时才会加载和播放! - Chris Allinson


在我的情况下,问题是由HTML格式引起的,我切换到以下格式,它工作。希望这有助于某人:

<audio id="audioFrenata" src="sounds/frenata.ogg"></audio>

注意缺乏 <source> 上面布局中的元素。


2
2017-10-16 15:00



这适用于我,Firefox,Chrome和Safari(尚未测试)。我发现它很奇怪,那不是我见过的格式。 - guival


检查您提到的浏览器是否支持您想要的HTML5功能。你可以检查一下 这里。希望这会帮助你。


0
2017-10-09 16:12





ID似乎是错误的。

$('#audioLevel').on('ended', function() {
     manageImageObjectsLevel();
}).get(0).play();

它假设是

$('#audioFrenata').on('ended', function() {
     manageImageObjectsLevel();
}).get(0).play();

使用以下HTML

<audio id="audioFrenata"  controls="controls">
    <source src="sounds/frenata.ogg" type="audio/ogg">
    <source src="sounds/frenata.mp3" type="audio/mpeg">
</audio>​

参考 现场演示


0
2017-10-09 16:15



是的,但是由于我的代码中的错误复制和粘贴,这只是一个错字。 - Matteo Ciman
这解决了问题的第一个问题(错误的ID) - 然而,这不会使iPad在访问jsFiddle时自动播放音频 - 请参阅我的帖子以澄清(我已在iPad上交叉检查以确保它确实调用时不自动播放 .play()  - 正如我在帖子中提到的,用户必须启动播放;) - Lasse Christiansen