使用HTML 5在Safari iOS中播放音频

时间:2014-06-23 16:03:26

标签: jquery ios html5

我无法让音频标签在iOS的safari上播放任何内容。我试图使用音频标签简单地播放文件。以下代码适用于Safari for Mac以及chrome for android。我知道' bandwidh保护'在iOS中需要用户交互来启动下载,但我已经通过从单击交互回调中调用以下代码来克服这个问题。 $("#mySpinner")spin.jshttp://fgnass.github.io/spin.js/)库的实例

this.audioElement = $('#myAudio');
this.audioElement.empty();

var currentTrack = // .. get the track from backbone model
.......
var source = $('<source></source>', {
    type: 'audio/mpeg',
    src: currentTrack.get('url'),
}).appendTo(this.audioElement);

this.audioElement.appendTo('#container');
console.log("Added the new track to the audio tag");

// $("#myAudio")[0].load();
$("#myAudio").on('canplay', function() {
    $("#myAudio")[0].play();
    $("#mySpinner").hide();
}); 

我自己关心的是canplay回调;旋转器在chrome中消失但在Safari for iOS上永远不会消失,这让我相信canplay可能是相关的。但是,根据https://developer.apple.com/documentation/webkitjs/htmlmediaelement,支持此回调。

1 个答案:

答案 0 :(得分:0)

问题是竞争条件。我的解决方案是从DOM中删除所有音频元素,然后使用onclick事件中的url重新填充。

像这样:

        .........
        .........

        // This function modifies the audio tag in order to play the next track
        changeTrack: function() {                
            var currentTrackIndex = this.get('playlistCollection').currentIndex;
            var currentTrack = this.get('playlistTracksCollection').getTrackForIndex(currentTrackIndex - 1); // Indexes aren't 0 based for some reason.....

            // this.changeAudioTrack(currentTrack.get('url'));
            $("#mySpinner").show();
            this.changeAudioTrack(currentTrack.get('url'));
            CSAppConfig.globalAudio.on('canplay', function() {
                $("#mySpinner").hide();
            });
        },

        makeAudio: function() {
            // Create the audio element
            var audio = $('<audio></audio>', {
                id: 'myAudio',
            });
            audio.appendTo($('body'));
            return audio;
        },

        makeAndAppendSource: function(audio, url) {
            // Create the source element
            var source = $('<source></source>', {
                type: 'audio/mpeg',
                src: url
            });
            source.appendTo(audio);
        },

        changeAudioTrack: function(audioURL) {
            // Change the audio track
            CSAppConfig.globalAudio[0].pause();
            CSAppConfig.globalAudio.remove();
            CSAppConfig.globalAudio = this.makeAudio();
            this.makeAndAppendSource(CSAppConfig.globalAudio, audioURL);
            console.log('Calling play');
            CSAppConfig.globalAudio[0].play();
        },

        .........
        .........