gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:05:41 26 4
gpt4 key购买 nike

在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com