zoukankan      html  css  js  c++  java
  • 关于html5 audio 标签在ios系统上不能正常自动播放的解决办法

    由于 iOS Safari 限制不允许 audio autoplay, 必须用户主动交互(例如 click)后才能播放 audio, 因此我们通过一个用户交互事件来主动 play 一下 audio.

    这个坑相信大家都已经踩过了, 在 iOS 9 没出现以前, 这样的 hack 方案还是妥妥的.
    但 iOS 9 出现后, 发现这个方案"失效"了.

    没有办法, 看来是时候升级一下 hack 方案了, 于是仔细看了下 audio 的事件.

    对于能够自动播放时事件的顺序如下
    loadstart -> loadedmetadata -> loadeddata -> canplay -> play -> playing

    对于不能自动播放时触发的事件因系统版本不同而不同
    * iPhone5 iOS 7.0.6 loadstart
    * iPhone6s iOS 9.1 loadstart -> loadedmetadata -> loadeddata -> canplay

    最终发现相比原来的 hack 方案, 对于 iOS 9 还需要额外的 load 一下, 否则直接 play 不能让 audio 开始播放.
        audioEl.load(); // iOS 9
        audioEl.play(); // iOS 7/8 仅需要 play 一下

    复制代码
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
        <title>Fake auto play html audio in iOS Safari the right way</title>
    </head>
    <body>
        <h1>在 iOS Safari 中假装自动播放 HTML5 audio(音乐) 的正确方式</h1>
        <p>核心原理: 通过一个用户交互事件来主动 play 一下 audio</p>
        <br>
        <br>
        <br>
        <audio id="bgmusic" autoplay preload loop controls></audio>
        <script>
        (function() {
            function log(info) {
                console.log(info);
                // alert(info);
            }
            function forceSafariPlayAudio() {
                audioEl.load(); // iOS 9   还需要额外的 load 一下, 否则直接 play 无效
                audioEl.play(); // iOS 7/8 仅需要 play 一下
            }
    
            var audioEl = document.getElementById('bgmusic');
    
            // 可以自动播放时正确的事件顺序是
            // loadstart
            // loadedmetadata
            // loadeddata
            // canplay
            // play
            // playing
            // 
            // 不能自动播放时触发的事件是
            // iPhone5  iOS 7.0.6 loadstart
            // iPhone6s iOS 9.1   loadstart -> loadedmetadata -> loadeddata -> canplay
            audioEl.addEventListener('loadstart', function() {
                log('loadstart');
            }, false);
            audioEl.addEventListener('loadeddata', function() {
                log('loadeddata');
            }, false);
            audioEl.addEventListener('loadedmetadata', function() {
                log('loadedmetadata');
            }, false);
            audioEl.addEventListener('canplay', function() {
                log('canplay');
            }, false);
            audioEl.addEventListener('play', function() {
                log('play');
                // 当 audio 能够播放后, 移除这个事件
                window.removeEventListener('touchstart', forceSafariPlayAudio, false);
            }, false);
            audioEl.addEventListener('playing', function() {
                log('playing');
            }, false);
            audioEl.addEventListener('pause', function() {
                log('pause');
            }, false);
    
            // 由于 iOS Safari 限制不允许 audio autoplay, 必须用户主动交互(例如 click)后才能播放 audio,
            // 因此我们通过一个用户交互事件来主动 play 一下 audio.
            window.addEventListener('touchstart', forceSafariPlayAudio, false);
    
            audioEl.src = 'http://www.w3school.com.cn/i/song.mp3';
        })();
        </script>
    </body>
    </html>
  • 相关阅读:
    python 字典转对象实现
    漏洞复现的整理
    mlx90614红外传感器
    【小程序码】登录的技术实现案例
    Spring mvc Aop
    MSHFLEXGRID常用的属性,方法事件
    InsertAuditEntryNew
    Froggy 的 CSP-2021 S1 游记
    JOI Open 偷学记录
    生产订单工序新增、修改、删除——CO_SE_PRODORD_OPR_CREATE、CO_SE_PRODORD_OPR_CHANGE、CO_SE_PRODORD_OPR_DELETE
  • 原文地址:https://www.cnblogs.com/cpqwebfe/p/7543256.html
Copyright © 2011-2022 走看看