【问题标题】:HTML5 Audio Tag cannot raise event `canplay` on mobileHTML5 音频标签无法在移动设备上引发事件“canplay”
【发布时间】:2014-07-12 04:01:07
【问题描述】:

我用 JS 和 HTML5 定制了一个音频播放器。 首先,我做的很简单:

  <div id="btnPlayPause" playing="" state=""></div>
  <audio style="display:none;" id="realSounder" preload="meta">
    <source src="" type="audio/mpeg">        
  </audio>

还有 JS:

$("#btnPlayPause").click(function(){
    realSounder = document.getElementById('realSounder');
    realSounder.src = "http://domain.com/aloha.mp3";
    realSounder.play();
});

运行良好。但是当我用 UI 控件实现时,需要更复杂的代码:

function initPlayer () {
    realSounder = document.getElementById('realSounder');
    realSounder.volume = 0.8;
    subscribe('canplay', realSounder, function() {
         if (realSounder.getAttribute('state') != 'playing')
             realSounder.play();
     });
    subscribe('canplaythrough', realSounder, function() {       
        if (realSounder.getAttribute('state') != 'playing')
            realSounder.play();
    });
}
function subscribe(event, element, func) {
    //addEventListener for cross-browser. 
    if (element.addEventListener) {
        element.addEventListener(event, func, false);
    } else if (element.attachEvent) {
        element.attachEvent("on" + event, func);
    } else {
        element['on' + event] = func;
    }
}
$(document).ready(function() {
    initPlayer();
    $("#btnPlayPause").click(function(e) {      
        e.preventDefault();
        //do something for display

        play();
    });
});

function play() {
    var loadUrl = "/wap.php/AjaxLoadAudio";
    var audioId = $("#btnPlayPause").attr('playing'); //get id of audio
    
    $.getJSON(
        loadUrl,
        {audio_id:audioId},
        function(json){
            realSounder.src = json.audio_share_url;
        }
    ).error(function() {
            console.log('Error: 404');
    });    
}

它不起作用。似乎realSounder 无法引发事件canplaycanplaythrough 来播放声音。为什么?我尝试在 canplaycanplaythrough 的处理程序函数中使用 console.log() 或 alert() 但什么也没发生!

注意:

我已经测试了这段代码并且成功

  • IE11/Windows Phone 8.1
  • Android 浏览器/Android 4.1,4.3

然后失败

  • Safari / iPhone 4、4S
  • Firefox、Chrome / Android 4.1、4.3

【问题讨论】:

  • 所以,这和'canplay'无关?在我看来,这里的问题更多地与用户交互和对“play()”的调用之间存在脱节有关 - 即点击 -> ajax ==/== canplay -> play()。这个问题的标题有没有可能改变?

标签: javascript html html5-audio


【解决方案1】:

移动设备需要用户直接的、物理的、同步交互来播放音频或视频。您已经避免了通过要求用户实际单击按钮来尝试在页面加载时播放音频的常见陷阱,但是您通过使用$.getJSON 发出异步请求破坏了同步规则。您偶然发现了“从不使用同步 XHR”规则的唯一个例外。我以前从未推荐过这个,但尝试用这个替换你的play() 函数:

function play() {
    var audioId = $("#btnPlayPause").attr('playing'); //get id of audio

    $.ajax({
        url:"/wap.php/AjaxLoadAudio"
        data: { audio_id: audioId },
        dataType: "json",
        async: false,
        success: function(response){
            realSounder.src = response.audio_share_url;
        },
        error: function() {
            console.log("Error");
        }
    });
}

【讨论】:

  • 非常感谢!我明白了!
  • 有没有办法让音频元素对音频进行排队,以便在实际播放之前没有延迟?在 Android 上,我设置了音频元素的 src 属性,然后在启用播放按钮之前等待“canplay”事件。对于 iOS,它似乎在调用 play() 之后才会发出“canplay”。这对我来说没有多大意义,tbh,所以我想知道我是否有什么问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-06
  • 1970-01-01
  • 2015-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多