Установка текущего времени тега <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>

Это связано с тем, что песня загружается с начала?

Спасибо!

EDIT:

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

С .get [0], он тоже не работает.

Кто-нибудь может прояснить мне ситуацию? Очень благодарен!

Ответ 1

Перед установкой текущего времени вам нужно подождать до источника audio.

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

Ответ 2

Сначала в вашем коде есть ошибка, потому что 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();
}
});

Вам нужно играть с ним, чтобы быть уверенным, что лучше всего в вашей ситуации, например, возобновить (играть снова) метод, чтобы задержать его на секунду или около того.

При использовании этого метода вам не нужно использовать функцию автовоспроизведения, потому что большую часть времени он не работает.

Надеюсь, это поможет, привет, Erwinus

Ответ 3

то, что я нашел в моем случае, - это проблема с контекстом где-то. Я инициализирую звук в контексте окна, но когда я пытаюсь изменить currentTime из ответа XMLHttpRequest, он НЕ работает. Я еще не знаю ответа, но я даю ключ, возможно, эксперт в 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;
    };
};

Ответ 5

Это работает для меня.

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

Надеюсь, что это поможет!