javascript - Blazor 播放无文件生成的声音

标签 javascript html audio blazor web-audio-api

在 Blazor 项目中,我将声音/噪声信号生成为 @DanW 的粉红噪声 example ,生成 double[]值在 -1.0 - 1.0 之间。是否可以在浏览器中直接将此数组作为音频播放?到目前为止,我发现的关于声音/音频和浏览器的所有内容都是从现有文件中播放音频。
编辑:我正在使用 C# 中的一些 native dll 进行一些过滤,并且在 c# 中比在 javascript 中更舒服,因此尝试在 C# 而不是 javascript 中完成大部分工作。

最佳答案

所以我使用 WebAudio API 来弄清楚如何:
Javascript:

// for cross browser compatibility
const AudioContext = window.AudioContext || window.webkitAudioContext;
audioCtx = {};

function initAudio() {
    // creation of audio context cannot not be done on loading file, must be done afterwards
    audioCtx = new AudioContext();
    return audioCtx.sampleRate;
}

// floats is a 1-D array with channel data after each other:
// ch1 = floats.slice(0,nSamples)
// ch2 = floats.slice(nSamples,nSamples*2)
function playNoise(floats, nChannels) {
    const bufferSize = floats.length / nChannels;
    let arrayBuffer = audioCtx.createBuffer(nChannels, bufferSize, audioCtx.sampleRate);

    for (var i = 0; i < nChannels; i++) {
        let f32arr = new Float32Array(floats.slice(i * bufferSize, (i + 1) * bufferSize));
        arrayBuffer.copyToChannel(f32arr, i, 0);
    }

    // Creating AudioBufferSourceNode
    let noise = audioCtx.createBufferSource();
    noise.buffer = arrayBuffer;
    noise.connect(audioCtx.destination);
    noise.start();
    return true;
}
Blazor 页面(我使用 Blazorise ( Button )):
@page "/Tests"
@inject IJSRuntime js
<h3>Test</h3>
<Button Clicked="@(async () => await TestJS())" Color="Color.Primary">Test JS</Button>

@code {
    double fs;
    protected override async Task OnInitializedAsync()
    {
        fs = await js.InvokeAsync<double>("initAudio");
        await base.OnInitializedAsync();
    }

    private async Task TestJS()
    {
        var nChannels = 2;
        var nSecs = 5;
        var nSampels = (int)fs * nSecs * nChannels;
        var floats = new float[nSampels];
        var freq = 440;
        for (int i = 0; i < nSampels / nChannels; i++)
        {
            floats[i] = (float)Math.Sin(i * freq * 2 * Math.PI / fs);
            floats[i + nSampels / 2] = (float)Math.Sin(i * freq * 2 * 2 * Math.PI / fs);
        }
        var ok = await js.InvokeAsync<bool>("playNoise", floats, nChannels);
    }
}
该按钮在左 channel ( channel 1)中播放 440 Hz 音调,在右 channel ( channel 2)中播放 880 Hz 音调。
编辑:采样率不必与 AudioContext 中的相同.查看here规范。

关于javascript - Blazor 播放无文件生成的声音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69567191/

相关文章:

javascript - 如何对 ng-repeat 内的动态文本框值求和

iphone - 当我使用Finch播放音频时,我真的可以做OpenAL可以做的所有事情吗?

python - 绘制WAVE的频谱分析图像的代码示例

javascript - 从内部指令定位

javascript - 如何获取动态生成元素的id属性?

javascript - 对 Django 数据库值 : views. py、模板或 Javascript 执行计算?

javascript - 如何缓慢迭代 jquery 循环,并每次替换占位符文本

javascript - 如何检查div前面的滚动位置

android - 无法在NDK oboe LiveEffect示例代码中更改音频源

javascript - 有没有办法在 location.replace 中添加 document.url