Установка скорости воспроизведения для аудиоэлемента, подключенного к api веб-аудио

Я экспериментировал с подключением аудиоэлемента к веб-аудио api с помощью createMediaElementSource и заставил его работать, но мне нужно было изменить скорость воспроизведения аудио-тега, и я не мог заставить это работать.

Если вы попытаетесь запустить приведенный ниже код, вы увидите, что он работает, пока вы не раскомментируете строку, в которой мы установили скорость воспроизведения. Когда эта строка находится, звук отключается.

Я знаю, что могу установить скорость воспроизведения на AudioBufferSourceNode с помощью source.playbackRate.value, но это не то, что я хотел бы сделать, мне нужно установить скорость воспроизведения для аудиоэлемента, когда он подключен к веб-аудио api с помощью createMediaElementSource поэтому у меня нет AudioBufferSourceNode.

Кому-нибудь удалось это сделать?

var _source,
     _audio,
     _context,
     _gainNode;

_context = new webkitAudioContext();

function play(url) {
    if (_audio) {
        _audio.pause();
    }
    _audio = new Audio(url);
    //_audio.playbackRate = 0.6;

    setTimeout(function() {
        if (!_gainNode) {
            _gainNode = _context.createGainNode();
            _gainNode.gain.value = 0.1;
            _gainNode.connect(_context.destination);
        }

        _source = _context.createMediaElementSource(_audio);
        _source.connect(_gainNode);

        _audio.play();
    }, 0);

}

play("http://geo-samples.beatport.com/items/volumes/volume2/items/3000000/200000/40000/9000/400/60/3249465.LOFI.mp3");

setTimeout(function () {
    _audio.pause();
}, 4000);

person St Kiss    schedule 20.04.2012    source источник
comment
Странно, у меня это работает в Chrome. jsfiddle.net/9gLKM - Chrome: версия 22.0.1229.94 m   -  person Achal Dave    schedule 31.10.2012
comment
Это все еще проблема в Safari (по крайней мере v13.0.0, но, возможно, раньше); Chrome / Firefox работают нормально. после подключения узлов API веб-аудио громкость и скорость воспроизведения больше нельзя установить в теге audio. Для увеличения громкости подключите GainNode и, как вы уже сделали, Как уже упоминалось, для режима воспроизведения подключите AudioBufferSourceNode.   -  person Alexander Turinske    schedule 25.10.2019


Ответы (2)


Вы должны установить скорость воспроизведения после начала воспроизведения звука. Единственный переносимый способ, который я нашел для выполнения этой работы, - это дождаться, пока вы не получите событие timeupdate с действительным currentTime:

_audio.addEventListener('timeupdate', function(){
    _if(!isNaN(audio.currentTime)) {
        _audio.playbackRate = 0.6;
    }
});

Обратите внимание, что скорость воспроизведения в настоящее время не поддерживается на Android и что Chrome (на компьютере) не поддерживает скорость воспроизведения ниже 0,5.

person mzedeler    schedule 07.05.2013
comment
Это похоже на ошибку. Где в спецификации указывается, что скорость воспроизведения звука не может быть установлена ​​до момента первоначального воспроизведения? - person idbehold; 07.05.2013
comment
Когда я читал спецификацию (w3.org/html/wg/drafts/html/master/), предполагается, что defaultPlaybackRate (пере) установит playbackRate, как только начнется воспроизведение. После этого скорость воспроизведения можно динамически установить с помощью playbackRate. Делать это так, как я писал выше, немного странно, но, увы, это единственное, что работает. Поверьте мне :) (я являюсь текущим автором github.com/Notalib/LYT и потратил около 40 часов только на этот вопрос.) - person mzedeler; 08.05.2013
comment
Как насчет настройки defaultPlaybackRate ? - person idbehold; 08.05.2013
comment
Я не говорю, что вы ошибаетесь насчет необходимости устанавливать его после воспроизведения. Я просто не понимаю почему так. Браузер должен иметь возможность абстрагироваться от этого требования, а спецификация должна возлагать ответственность на поставщиков браузера. - person idbehold; 09.05.2013
comment
В спецификации упоминается, что браузер может предоставлять пользователю визуальные элементы управления, при этом браузер может позволять пользователю изменять скорость воспроизведения. Во-первых, позволить браузеру открывать интерфейс управления для конкретного браузера - действительно плохая идея, но так сформулирована спецификация. Я думаю, что взаимодействие с этим интерфейсом требует наличия как playbackRate, так и defaultPlaybackRate. - person mzedeler; 09.05.2013
comment
Я не особо экспериментировал с defaultPlaybackRate, но насколько я помню, некоторые браузеры просто не поддерживают этот атрибут. - person mzedeler; 09.05.2013

Какой браузер вы используете для тестирования? Кажется, это еще не реализовано в Firefox, но должно работать в Chrome.

Ошибка Mozilla для реализации режима воспроизведения: https://bugzilla.mozilla.org/show_bug.cgi?id=495040

person TheJF    schedule 20.04.2012
comment
Я использую хром. Firefox поддерживает звуковой тег, но не поддерживает api веб-аудио, и в моем коде используются обе технологии, поэтому он не будет работать в firefox. - person St Kiss; 20.04.2012
comment
В Chrome функция воспроизведения работает с автономным аудиотегом, но я пытаюсь заставить его работать с аудиоэлементом, который подключен к веб-аудио api с помощью createMediaElementSource. Это та часть, с которой я не мог работать. - person St Kiss; 20.04.2012