AudioContext生成和播放音频的方法

1,072 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情

缘由

最近在github看到音频制作,觉得很神奇,就查看源码记录了一下。 感兴趣的可以看看大佬是怎么做的。 github地址:ZzFXM

大概思路

使用web audio api制作音频,先创建音频上下文(AudioContext),然后创建一个缓存和一个数据源,将音频数据复制并设置到音频,最后执行音频数据。这里audioContext详细的讲解和api都可以自己了解一下,毕竟我只是个菜鸟,这次主要是说他能制作并播放音频。

音频的制作部分可以通过大佬的制作工具搞出来,地址就放在这里convert

这里是摘抄出来的代码:

let audioContext;

/** 播放和设置音频
 *  @param {Array}   音频数据
 *  @param {Number}  [volume=1] - 音量
 *  @param {Number}  [rate=1] - 播放速度
 *  @param {Number}  [pan=0] - 立体音频播放使用数
 *  @param {Boolean} [loop=0] - 循环
 *  @return {AudioBufferSourceNode} - 音频节点
 *  @memberof Audio */
function playSamples(sampleChannels, volume=1, rate=1, pan=0, loop=0) 
{
    if (!soundEnable) return;

    // 创建音频上下文
    if (!audioContext)
        audioContext = new (window.AudioContext||webkitAudioContext);

    // 创建一个缓存和一个数据源
    const buffer = audioContext.createBuffer(sampleChannels.length, sampleChannels[0].length, zzfxR), 
        source = audioContext.createBufferSource();

    // 将数据源复制到缓存,放到数据源里
    sampleChannels.forEach((c,i)=> buffer.getChannelData(i).set(c));
    // 设置数据源缓存
    source.buffer = buffer;
    // 播放速率
    source.playbackRate.value = rate;
    // 循环播放
    source.loop = loop;

    // 创建音频相关节点
    source
        // .connect(new StereoPannerNode(audioContext, {'pan':clamp(pan, 1, -1)}))
        // .connect(new GainNode(audioContext, {'gain':soundVolume*volume}))
        .connect(audioContext.destination);

    // 播放并放回数据源
    source.start();
    return source;
}

下面给一个普通的例子体验一下

code.juejin.cn/pen/7104174…