专栏名称: SegmentFault思否
SegmentFault (www.sf.gg)开发者社区,是中国年轻开发者喜爱的极客社区,我们为开发者提供最纯粹的技术交流和分享平台。
目录
相关文章推荐
程序员的那些事  ·  北京大学出的第二份 DeepSeek ... ·  昨天  
码农翻身  ·  中国的大模型怎么突然间就领先了? ·  昨天  
程序员的那些事  ·  OpenAI ... ·  2 天前  
程序猿  ·  “我真的受够了Ubuntu!” ·  4 天前  
程序员的那些事  ·  惊!小偷“零元购”后竟向 DeepSeek ... ·  5 天前  
51好读  ›  专栏  ›  SegmentFault思否

使用 Web Audio API 播放摩斯密码

SegmentFault思否  · 公众号  · 程序员  · 2017-10-12 08:00

正文

在 CSS-Tricks 上看到一篇介绍 Web Audio API 的文章,学以致用,为工具箱中的摩斯密码转换器加上了在线播放功能。

从 AudioContext 开始

Web Audio API 主要通过 AudioContext 来处理音频,就好像 RenderingContext 之于 Canvas API。

  1. // Safari 需要 `webkit` 前缀

  2. var AudioContext = window.AudioContext || window.webkitAudioContext;

  3. var ctx = new AudioContext();

通常一个典型的 Web Audio API 操作流程是这样的:

创建音频上下文对象

创建音频源:音频文件、振荡器(生成声波)或音频流(摄像头/麦克风)

连接效果节点

输出音频

通过 Oscillator(振荡器)生成声波

Oscillator 可以发出指定波形和频率的声波。

让我们来听下四种常见的波形: 方波 (square)、三角波 (triangle)、正弦波 (sine) 和锯齿波 (sawtooth)

通过 Oscillator,我们无需音频文件,就能生成和电报一样的声音:

  1. var oscillator = ctx.createOscillator();

  2. // 设置波形

  3. oscillator.type = "sine";

  4. // 设置频率

  5. oscillator.frequency.value = 600;

播放音频

为了把音频输出到扬声器,你需要将各个节点连接起来。 接着上面的代码,将 Oscillator 节点连接到 AudioContext.destination(即输出设备),调用 start() 方法开始播放。

  1. var AudioContext = window.AudioContext || window.webkitAudioContext;

  2. var ctx = new AudioContext();

  3. var oscillator = ctx.createOscillator();

  4. oscillator.type = "sine";

  5. oscillator.frequency.value = 600;

  6. oscillator.connect(ctx.destination);

  7. oscillator.start();

调节音量

要更改音量,你需要连接一个 GainNode(音量控制器)节点。 新的节点路由变成了:oscillator -> gainNode -> destination

  1. var gainNode = ctx.createGain();

  2. oscillator.connect(gainNode);

  3. gainNode.connect(ctx.destination);

  4. // 从第 0 秒开始设置音量为 0.5

  5. gainNode.gain.setValueAtTime(0.5, 0);

gainNode.gain返回的是一个 AudioParam 对象,它有一个 setValueAtTime(value, startTime) 方法来在指定时间设置指定值。

  1. // AudioContext.currentTime 返回的是当前时间







请到「今天看啥」查看全文