pcm编码html audio,web Audio实现pcm音频数据收集

前面利用web audio api播放了本地音乐,并且利用createOscillator生成音频并播放。既然如此,我们能否接着用js去实现简单的录音呢?

音频源

getUserMedia

该方法有一个参数,constraints,指定请求的媒体类型,这儿只牵扯都音频,所以仅需audio:true即可。

该方法返回一个promise,成功回调的参数是一个 MediaStream对象。

createMediaStreamSource

此时createMediaStreamSource()方法就有用啦,引用MDN上的一段话:AudioContext接口的createMediaStreamSource()方法用于创建一个新的MediaStreamAudioSourceNode 对象, 需要传入一个媒体流对象(MediaStream对象), 然后来自MediaStream的音频就可以被播放和操作。

他返回的是MediaStreamAudioSourceNode类型的,也就是音频源节点,到此处,音频源已经有了,下面看下保存音频的节点(音频处理节点)。

navigator.mediaDevices.getUserMedia({

audio: true

}).then((stream) => {

audioInput = context.createMediaStreamSource(stream);

}).catch((err) => {

console.log('error');

});

此时,audioInput就是音频源节点。

音频处理节点

createScriptProcessorbufferSize,缓冲区大小,以样本帧为单位。一般有以下值 256,512,1024,2048,4096,8192,16384。当传0时,系统会取当前环境最合适的缓冲区大小。每当缓冲区满时,则会触发audioprocess事件,即bufferSize控制着回调事件的频率。注:mdn提示 chrome 31版本的不支持传0的方式。

numberOfInputChannels,值为整数,用于指定输入node的声道的数量,默认值是2,最高能为32,且不能为0。

numberOfOutputChannels,值为整数,用于指定输出node的声道的数量,默认值是2,最高能取32,不能为0。

保证numberOfInputChannels和numberOfOutputChannels相等就行了,通过监听audioprocess后,就可以处理对应的音频流了。

recorder = context.createScriptProcessor(4096,1,1);

recorder.onaudioprocess = function(e) {

// getChannelData返回Float32Array类型的pcm数据

var data = e.inputBuffer.getChannelData(0);

inputData.push(newFloat32Array(data));

size += data.length;

}

我这默认是一通道的,所以只对0进行了数据收集。MDN上说,audioporcess缓冲区的数据是,非交错的32位线性PCM,标称范围介于-1和之间+1,即32位浮点缓冲区,每个样本介于-1.0和1.0之间。所以等录音结束后,inputData中就是存放的pcm格式的录音数据了(还需处理下)。

总结

现在我们手上已经有了简单的pcm数据了,为了能够正常的播放,还得略微处理下,下篇将将探讨如何转数字信号。

想要看js录音的可以看这篇文章:纯js实现录音与播放。

总结

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要基于FFTW库实现C语言分析音频PCM数据的频率大小,可以按照以下步骤进行: 1. 首先,确保已经安装了FFTW库。你可以从FFTW的官方网站(http://www.fftw.org/)下载并安装库文件。 2. 在你的C程序中包含FFTW库的头文件: ```c #include <fftw3.h> ``` 3. 定义需要用到的变量,例如音频数据的长度、采样率等: ```c int audioLength = ...; // 音频数据的长度 int sampleRate = ...; // 音频数据的采样率 ``` 4. 创建输入和输出数组,用于存储音频数据和频率大小的结果: ```c fftw_complex *input = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * audioLength); fftw_complex *output = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * audioLength); ``` 5. 创建FFTW计划: ```c fftw_plan plan = fftw_plan_dft_1d(audioLength, input, output, FFTW_FORWARD, FFTW_ESTIMATE); ``` 6. 将音频数据填充到输入数组中: ```c for (int i = 0; i < audioLength; i++) { input[i][0] = audioData[i]; // 实部 input[i][1] = 0; // 虚部(置为0) } ``` 7. 执行FFT变换: ```c fftw_execute(plan); ``` 8. 计算频率大小: ```c for (int i = 0; i < audioLength; i++) { double frequency = (double)i * sampleRate / audioLength; // 计算频率 double magnitude = sqrt(output[i][0] * output[i][0] + output[i][1] * output[i][1]); // 计算幅度 // 在这里可以根据需要对频率大小进行处理或输出 } ``` 9. 清理内存并销毁FFTW计划: ```c fftw_destroy_plan(plan); fftw_free(input); fftw_free(output); ``` 以上是一个基本的框架,你可以根据具体的需求进行进一步的处理和优化。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值