#javascript #node.js #settimeout #node.js-stream
#javascript #node.js #settimeout #node.js-поток
Вопрос:
Я работаю с Node.js (v4.4.7) и написали несколько строк для воспроизведения звука…
const Speaker = require('audio-speaker/stream');
const Generator = require('audio-generator/stream');
const speaker = new Speaker({
channels: 1, // 1 channel
bitDepth: 16, // 16-bit samples
sampleRate: 44100 // 44,100 Hz sample rate
});
// Streams sample values...
const sound = new Generator(
//Generator function, returns sample values
function (time) {
return Math.sin(Math.PI * 2 * time * 2000);
},
{
//Duration of generated stream, in seconds, after which stream will end.
duration: Infinity,
//Periodicity of the time.
period: Infinity
});
// Pipe value stream to speaker
sound.pipe(speaker);
…ура, это работает! Теперь давайте попробуем приостановить звук и возобновить его через 3 секунды …
sound.pause();
setTimeout(()=>{
sound.resume();
console.log(sound.isPaused()); // => false
}, 3000);
… блестяще, это тоже работает! А теперь давайте попробуем наоборот и приостановим звук через 3 секунды…
setTimeout(()=>{
sound.pause();
console.log(sound.isPaused()); // => true / although sound is still playing
}, 3000);
… подождите, почему это не работает? И почему это звучит.isPaused() показывает «true», хотя звук все еще воспроизводится. Это ошибка или я делаю что-то не так?
Я прошел через Node.js документация и несколько руководств о потоках в Node.js и не мог найти объяснения.В этом руководстве они используют только setTimout() для возобновления потоков, но они ничего не говорят о том, почему вы не можете приостановить поток таким образом.
Комментарии:
1. Поделитесь полным исходным кодом, который не работает
2. Что вы имеете в виду? Это полный код.
3. Это буферная вещь? Вы ждете 3 секунды, чтобы сделать паузу, может быть, в течение этого времени происходит буферизация данных, поэтому звук продолжается? Останавливается ли это в конечном итоге?
4. Я сократил время ожидания всего до 10 мс, но звук продолжает звучать даже через несколько минут. В итоге я вызвал метод .cork() / uncork для динамика, который обеспечивает желаемый результат. Но мне все еще интересно, почему .pause()/.resume() не работает. Есть ли способ сразу удалить возможные буферизованные данные, просто чтобы убедиться, что звук пустой?
Ответ №1:
На данный момент я не знаю, почему вызов .pause()/.resume() в читаемом потоке работает не так, как ожидалось. В итоге я вызвал .cork()/.uncork() в записываемом потоке, что позволило достичь желаемого результата.
setTimeout(()=>{
speaker.cork();
}, 3000);
setTimeout(()=>{
speaker.uncork();
}, 3000);
Я обновлю этот ответ, как только у меня будет объяснение такого поведения.