web audio api 实现音频播放

这篇具有很好参考价值的文章主要介绍了web audio api 实现音频播放。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近被选中做音视频,挺幸运的吧,一直在接触新的项目,每次都能被分到新的项目组,干好多费头发的事情😂

上周五肝到12点半,总算是把音频编辑上了线

总结了一下,决定写一写,也盘点一下遇到的坑

web audio API是 HTML5新增的API,提供了在web上控制音频的一个有效通用的系统,开发者可以自选音频源,对音频添加特效,添加空间效果,使音频可视化,等等。

注:目前这个API浏览器支持度并不高,pc浏览器支持较好的有firefox、Chrome和safari,Safari上也依然有不少兼容问题,移动端支持android5.0及以上,iOS端是6.1以上版本支持;

web audio 从获取数据到播放的过程大概如下图:

web audio api 实现音频播放

Inputs: audio的输入节点,可以是buffer,也可以是audio对象;

Effects:操控音频的节点(目前就用到这个:GainNode, 后续用到其他的再补充)GainNode可以用来控制音量大小,默认为静音,即0,也可以用来设置音频播放的淡入淡出;

Destination:音频播放节点,负责把声音传输给扬声器或耳机;

完整的web audio流程如下:

1. 获取音频文件,实例化一个音频对象;

2. 将获取到的音频文件转成ArrayBuffer;

3. 用ArrayBuffer ,通过AudioContext 实例化一个AudioBuffer对象;

4. 用createBufferSource() 创建一个bufferSource对象,将AudioBuffer 赋值给bufferSource.buffer;

5. 用connect()把bufferSource和GainNode连接,然后再连接到音频播放节点Destination,开始播放音频;

具体代码分析如下:

1. 实例化一个音频对象;

const AudioContext = window.AudioContext || (window.webkitAudioContext as AudioContext)
this.audioContext = new AudioContext()

2. 将获取到的音频文件转成ArrayBuffer;

上传音频文件可以直接通过input file来获取,将上传的音频文件解析后上传至服务器,获取到audioUrl,上传音频这里就不多做介绍了;

async function getAudioArrayBuffer(audioUrl: string): Promise<ArrayBuffer> {
  const res = await fetch(audioUrl)
  return res.arrayBuffer()
}

const arrayBuffer = await getAudioArrayBuffer(audioUrl)

3. 用ArrayBuffer ,通过AudioContext 实例化一个AudioBuffer对象;

该方法涉及到一个兼容问题:iOS6上报错:Not enough arguments,iOS不知道是基于 promise 的decodeAudioData,所以此处需使用回调;

async function getAudioBuffer(arrayBuffer: ArrayBuffer, audioContext: AudioContext): Promise<AudioBuffer> {
  let resolveFn
  const promise = new Promise(resolve => resolveFn = resolve)
  audioContext.decodeAudioData(arrayBuffer, resolveFn)
  return promise as Promise<AudioBuffer>
}

this.audioBuffer = await getAudioBuffer(arrayBuffer, this.audioContext)

4. 创建一个bufferSource对象,将AudioBuffer 赋值给bufferSource.buffer;然后用connect连接;

this.bufferSourceNode = this.audioContext.createBufferSource()
this.volumeGainNode = this.audioContext.createGain()
this.fadeGainNode = this.audioContext.createGain()

this.bufferSourceNode.buffer = this.audioBuffer
this.bufferSourceNode.connect(this.volumeGainNode)
this.volumeGainNode.connect(this.fadeGainNode)
this.fadeGainNode.connect(this.audioContext.destination)

5. 接下来就可以开始播放了,播放前需设置音量和淡入淡出效果(如果是以默认值播放的话就不用,我这里涉及到操作,所以有预设值)

setVolume(value?: number) {
    this.volume = value ?? this.volume
    this.volumeGainNode?.gain?.value = this.volume / 100
}

setFadein() {
    this.fadein = Math.min(this.fadein, this.audioDuration / 2, 5)
    if (this.fadein === 0) return
    const waveArray = new Float32Array(2)
    waveArray[0] = 0.001
    waveArray[1] = 1
    this.fadeGainNode?.gain?.setValueCurveAtTime(waveArray, this.currentTime, this.fadein)
}

setFadeout() {
    this.fadeout = Math.min(this.fadeout, this.audioDuration / 2, 5)
    if (this.fadeout === 0) return
    const waveArray = new Float32Array(2)
    waveArray[0] = 1
    waveArray[1] = 0.001
    this.fadeGainNode?.gain?.setValueCurveAtTime(waveArray, this.currentTime + this.audioDuration - this.fadeout + 0.001, this.fadeout)
}

play() {
   if (!this.audioContext) return
   this.setVolume()
   this.setFadein()
   this.setFadeout()

   // 暂停后的播放
   this.audioContext.resume()
   // 设置播放开始时间startTime,有就设置,没有就不设置,默认为0,如需跳转至某个时间点播放,则需设置startTime值
   this.bufferSourceNode?.start(this.currentTime, this.startTime, this.audioDuration);
}

pause() {
   if (!this.isPlaying) return
   // 暂停音频上下文中的时间进程,暂停音频硬件访问并减少进程中的CPU/电池使用
   this.audioContext?.suspend()
}

resume() {
   if (this.isPlaying) return
   this.audioContext?.resume()
   this.isPlaying = true
}

这样的话一个基础的播放就实现了。文章来源地址https://www.toymoban.com/news/detail-406749.html

到了这里,关于web audio api 实现音频播放的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android Audio实战——音频播放(十)

            Android SDK 提供了3套音频播放的API,分别是:MediaPlayer,SoundPool,AudioTrack。简单来说,MediaPlayer 更加适合在后台长时间播放本地音乐文件或者在线的流式资源。SoundPool 则适合播放比较短的音频片段,比如游戏声音、按键声、铃声片段等等,它可以同时播放多个音频

    2024年02月15日
    浏览(31)
  • audio音频不能自动播放的解决方法

    由于浏览器限制的原因,不允许自动播放audio音频,尝试网上的方法后也没有进展(如果有解决方法,欢迎评论~) 一、首先创建 audio 标签 二、因为在页面刷新后需要先执行动画,动画完成后才去播放音乐,所以在执行 mounted 函数时,先加载音乐源 三、在动画完成后,进

    2024年02月11日
    浏览(77)
  • vue3 -- 使用audio标签播放音频

    公司系统内的审批页面,前端要根据后台推送的信息,使用’提示音’提醒用户进行对应审批操作。 vue3 项目 简介 | Vue.js (vuejs.org) TypeScript TypeScript: JavaScript With Syntax For Types. (typescriptlang.org) vite Vite | 下一代的前端工具链 (vitejs.dev) 下载好使用音频文件 音效网,保存本地。 将

    2024年02月01日
    浏览(33)
  • Unity 之利用Audio Source(音频源)组件用于播放声音

    Unity中的Audio Source(音频源)是一个用于播放声音的组件,通常附加到游戏对象上,以便在游戏中播放音频效果、音乐或对话。以下是Audio Source的详细介绍: 添加Audio Source : 要在Unity中使用Audio Source,首先需要将其附加到一个游戏对象上。通常,您可以选择场景中的一个空游

    2024年02月09日
    浏览(33)
  • 记录--关于前端的音频可视化-Web Audio

    最近听音乐的时候,看到各种动效,突然好奇这些音频数据是如何获取并展示出来的,于是花了几天功夫去研究相关的内容,这里只是给大家一些代码实例,具体要看懂、看明白,还是建议大家大家结合相关API文档来阅读这篇文章。 参考资料地址:Web Audio API - Web API 接口参考

    2024年02月16日
    浏览(35)
  • 音频编辑SDK Audio DJ Studio API for .NET

    Audio DJ Studio API for .NET  is a .NET class developed by MultiMedia Soft that makes it easy to add sound playback and mixing capabilities to your applications; thanks to the integration with DirectShow codecs and with the BASS library, both adding decoding capabilities for the most common sound formats such as MP3, WAV, Ogg Vorbis and many others, Audio D

    2024年02月13日
    浏览(39)
  • 基于vue+websocket实现web端的实时pcm音频播放

    pcm-player是一个JavaScript库,用于在浏览器中播放PCM音频文件。PCM是一种数字音频编码格式,它将模拟音频信号转换为数字信号。在Vue中使用PCMPlayer可以让你在Web应用中轻松处理音频播放。 安装pcm-player 在Vue组件中引入PCMPlayer 在你的Vue组件中,你需要引入PCMPlayer库。你可以在组

    2024年04月09日
    浏览(74)
  • 构建远程音乐库!群晖Audio Station公开共享音频实现公网访问

    之前文章我详细介绍了如何在公网环境下使用pc和移动端访问群晖audiostation: 公网访问群晖audiostation听歌 - cpolar 极点云 群晖套件不仅能读写本地文件,还能共享,那么我们如何以共享链接的形式分享本地音频文件呢? 按照本教程方法操作后,达到的效果是 公网环境 下(连

    2024年02月08日
    浏览(88)
  • web前端实时音频播放并绘制波形

    最新项目需要用到拉取实时声音流数据播放声音以及显示对应的波形图。如果是声音文件我们可以用 wavesurfer.js这个框架很轻松的绘制波形,但是实时声音怎么转换呢,以下是我的解决方案 后端需要将数据转换成PCM格式 我们用到下面2个库: 1.pcm-player (播放声音) 2.recorder

    2024年02月11日
    浏览(45)
  • 音频播放器Web页面代码实例(基于HTML5)

    音频播放器Web页面代码实例(基于HTML5):   特别需要注意的点:     如果上传文件时设置的是默认转码方式,所有的文件都会转码为视频文件,使用音频播放器播放视频文件时,只会播放声音,没有图像。     如果上传文件时设置了\\\"源文件播放\\\",平台不会对源文件进行

    2024年02月16日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包