封装通过js播放音频文件的函数

230 阅读1分钟

做下笔记,通过js播放音频文件。使用方式在注释中。

/**
 * 该函数播放一个音频文件,如果你想让它循环播放,你可以指定一个循环间隔时间
 * @param {RequestInfo | URL} musicFile - 您要播放的文件
 * @param {number} [loopTime] - 循环播放的间隔时间,不传则播放一次(以毫秒为单位)
 * @returns 返回音频源(bufferSource)
 */
export async function playAudio(musicFile: RequestInfo | URL, loopTime?: number): Promise<AudioBufferSourceNode> {
  //@ts-ignore
  const AudioContext = window.AudioContext || window.webkitAudioContext
  const audioCtx = new AudioContext()
  const source = audioCtx.createBufferSource()
  const myRequest = new Request(musicFile)
  const response = await fetch(myRequest)
  const buffer = await response.arrayBuffer()
  await audioCtx.decodeAudioData(buffer, (decodedData) => {
    source.buffer = decodedData
    source.connect(audioCtx.destination)
  })
  source.start()
  //如果传入了循环间隔时间,则设置循环播放
  if (loopTime) {
    source.onended = () => {
      setTimeout(() => {
        playAudio(musicFile, loopTime)
      }, loopTime)
    }
  }
  return source
}