设置<audio>标签的currentTime不起作用?</audio>

时间:2011-12-23 23:23:30

标签: javascript html5 html5-audio

我在后台播放这个音频标签,我可以在几秒钟内将进度存储到cookie中。 但是,我无法从该cookie启动音频。 (继续在其他页面上)

$("p#sound audio").currentTime = $.cookie("audioTime");

<audio autoplay="autoplay" loop="loop" ontimeupdate="document.getElementById('tracktime').innerHTML = Math.floor(this.currentTime); $.cookie('audioTime', Math.floor(this.currentTime));">
    <source src="audio/song.ogg" type="audio/ogg" />
    <source src="audio/song.mp3" type="audio/mp3" />
    Your browser does not support the audio tag.
</audio>
<span id="tracktime">0</span>

这是否与从头开始重新加载的歌曲有关?

谢谢!

编辑:

$("p#sound audio").get[0].currentTime

使用.get [0],它也不起作用。

有人可以帮我清理一下吗?非常感谢!

6 个答案:

答案 0 :(得分:7)

在设置当前时间之前,您需要等到audio源加载。

$(function(){
    $('audio').bind('canplay', function(){
        $(this)[0].currentTime = $.cookie('audioTime');
    });
});

答案 1 :(得分:4)

首先,你的代码中有一个错误,因为currentTime不是jQuery的一部分(但你已经知道了)

$("p#sound audio").currentTime // is incorrect (refers to a property of jQuery)
$("p#sound audio")[0].currentTime // is correct (refers to a property of DOM element)

我发现音频标签有一些奇怪的东西,并且可以在浏览器之间以不同的方式运行,例如在Chrome中。

首先,你必须等待'durationchange'事件,以确保对象知道长度。

在此之后,您必须使用“play()”启动流(如果尚未启动)并使用“pause()”功能暂停(有时在短暂延迟后)。然后,您可以使用值更改“currentTime”属性。在此之后,您必须使用'play()'功能再次启动流。

此外,有时需要使用“load()”函数自行加载流。

这样的事情:

$(document).ready( function()
{
var a = $('audio:first'),
    o = a[0];

a.on( 'durationchange', function(e)
{
  var o = e.target;
  if( o )
  {
   o.pause();
   o.currentTime = parseInt( $.cookie("audioTime"));
   o.play();
  } 
});

if( o )
{
  o.load();
  o.play();
}
});

你必须玩它才能确保在你的情况下最好的是什么,例如恢复(再次播放)方法将它延迟一秒左右。

使用此方法时,您不必使用自动播放功能,因为大部分时间它都不起作用。

希望它有所帮助,greetz, Erwinus

答案 2 :(得分:3)

您可以通过将t=<time>添加到网址来设置开始时间,如下所示:https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Using_HTML5_audio_and_video#Specifying_playback_range

E.g。 <audio src="http://example.com/audio.mp3#t=50></audio>

答案 3 :(得分:1)

我在我的案例中发现,某个地方的情境存在问题。我在窗口上下文中初始化音频,但是当我尝试从XMLHttpRequest响应中更改currentTime时,它不起作用。我还不知道答案,但我提供了一个线索,也许Javascript的专家会知道如何使它工作。

/* initialize this.audio player */
Audio = function() {
    var that = this;
    // keep track of playback status
    var AudioStatus = {
            isPlaying : false
    };

    // define references to this.audio, pulldown menu, play-button, slider and time display
    that.audio = document.querySelector("AUDIO");

    /* load track by menu-index */
    var loadTrack = function() {

        if(that.audio == null){
            log("audio null"); return;
        }
        that.audio.src = '../sounds/400.mp3';
        that.audio.load();
    };

    /* callback to play or pause */
    that._play = function() {
        if(that.audio == null){
            log("audio null"); return;
        }  
        that.audio.play();
        AudioStatus.isPlaying = true;
    };

    that._pause = function() {

        if(that.audio == null){
            log("audio null"); return;
        }
        that.audio.pause();
        AudioStatus.isPlaying = false;
    };

    that.playPause = function() {
        if (that.audio.paused) {
            self._play();
        }
        else {
            self._pause();
        }
    };

    /* callback to set or update playback position */
    that.updateProgress = function(value) {
        if(that.audio == null){
            log("audio null"); return;
        }
        that.audio.currentTime = value;    // <<<--- it does NOT work if I call from XMLHttpRequest response but it DOES if it is called from a timer expired call back
    };

    that.isAudioPlaying = function(){
        return AudioStatus.isPlaying;
    };
};

答案 4 :(得分:0)

这对我有用。

if (!isNaN(audio.duration)) {
    audio.currentTime = 0;
}

希望它有所帮助!

答案 5 :(得分:0)

这为我解决了这个问题:


  $("p#sound audio").on('loadedmetadata', () => {
    $("p#sound audio").get(0).load();
  });

所以我以后可以设置currentTime而不用担心是否加载了音频。