JS中如何避免键盘控制音频

How to avoid keyboard control to audio in JS

我有一个非常简单的应用程序,它会在用户键入内容时显示键入音频,并在用户停止键入时停止音频。

代码如下:

let audio = new Audio('https://www.fesliyanstudios.com/play-mp3/768')
let timeout;
let input = document.querySelector('input')
input.onkeydown=function(){
    window.clearTimeout(timeout)
   audio.play()
   
}
input.onkeyup= function(){
    window.clearTimeout(timeout)
    timeout = setTimeout(()=>{audio.pause()},1000);
}
<input></input>

但是,我发现我的键盘上有一个start/stop audio/video键(某些键盘中的F8键),如果用户按下这个键,就会播放打字音频。 “

有什么方法可以避免这种情况发生?

感谢任何回复!

这是个好问题!答案是浏览器假定标准媒体元素中的任何内容都是可从外部控制的,因此 play/pause 控制可以通过键盘、蓝牙控制器、锁屏控件等来完成。

一个解决方案是使用 Web Audio API 代替播放。无论如何,这可能更适合您的用例,因为它可以让您更好地控制音频样本的缓冲和时间。

首先获取音频源数据,将其解码为PCM缓冲区,然后通过AudioBufferSourceNode. Untested code, but try something like this in an async function:

播放
// Set up audio context and source node
const audioContext = new AudioContext();
const sourceNode = audioContext.createBufferSource();
sourceNode.connect(audioContext.destination);

// Make HTTP request for audio data
const res = await fetch('https://www.fesliyanstudios.com/play-mp3/768');
if (!res.ok) {
  throw res.status;
}

// Get the raw data and decode it to PCM
sourceNode.buffer = await audioContext.decodeAudioData(
  await res.arrayBuffer()
);

// Start playback
sourceNode.start();

请注意,您应该只在有用户交互时创建此音频上下文。如果你想早点创建它,你可以随时调用 .resume() 与用户交互。这是避免自动播放政策问题所必需的

希望这能让你入门!