【问题标题】:How to avoid keyboard control to audio in JS如何在JS中避免键盘控制音频
【发布时间】:2022-01-26 01:08:48
【问题描述】:

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

代码如下:

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>

但是,我发现我的键盘上有一个开始/停止音频/视频键(某些键盘上的 F8 键),如果用户按下此键,将播放打字音频。 "

有没有办法避免这种情况发生?

感谢您的回复!

【问题讨论】:

    标签: javascript audio html5-audio web-audio-api mediaelement


    【解决方案1】:

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

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

    您将首先获取音频源数据,将其解码到 PCM 缓冲区,然后通过AudioBufferSourceNode 播放。未经测试的代码,但在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() 进行用户交互。这是避免自动播放政策问题所必需的

    希望这能让你开始!

    【讨论】:

    • 非常感谢您的回答。所以我们正在使用 React.js 来解决这个问题?
    • 不,React.js 与这段代码无关。至于 async/await,请点击答案中的链接:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 通过使用 async/await,您将不必担心大量嵌套的 Promise 链。您的代码仍然异步运行,但语法更简单。基本上,将所有内容包装在 async function someFunction() { ... } 中,并在用户输入时调用该函数。
    • 啊,抱歉,应该是audioContext.destination。至于无法获取消息,请检查开发人员工具的网络选项卡以查看错误是什么。通常是404,意思是找不到。但是,您的源可能不支持 CORS……在这种情况下,您将无法使用 AudioContext。如果源是您的服务器,您可以设置 Access-Control-Allow-Origin: * 标头来修复它。如果是别人的,您必须下载 MP3 并从您自己的服务器上提供。
    • 是的,或者添加我上面提到的标题(如果这是你的服务器),或者下载这个 MP3 并在你自己的服务器上提供它,你可以控制这个标题。
    • 另见:enable-cors.org
    猜你喜欢
    • 2015-08-16
    • 2016-08-12
    • 2021-05-31
    • 2015-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多