我正在创建一个应用程序,我从inputBuffer获取mic数据,我想要流式传输到另一个客户端并播放它。但是,我无法忍受它。
我的录制/捕获工作正常,所以我将跳到代码的相关部分
function recorderProcess(e) {
var left = e.inputBuffer.getChannelData(0);
var convert = convertFloat32ToInt16(left);
window.stream.write(convert);
var src = window.URL.createObjectURL(lcm);
playsound(convert);
ss(socket).emit('file',convert, {size: src.size},currentgame);
ss.createBlobReadStream(convert).pipe(window.stream);
//ss.createReadStream(f).pipe(widnow.stream);
}
function playsound(raw) {
console.log("now playing a sound, that starts with", new Uint8Array(raw.slice(0, 10)));
context.decodeAudioData(raw, function (buffer) {
if (!buffer) {
console.error("failed to decode:", "buffer null");
return;
}
var source = context.createBufferSource();
source.buffer = buffer;
source.connect(context.destination);
source.start(0);
console.log("started...");
}, function (error) {
console.error("failed to decode:", error);
});
}
我能够使用float32toint16函数成功创建一个数组缓冲区,但是当我使用init声音函数时,我得到一个错误" null"意味着arraybuffer不会解码为音频流?其他人遇到过这个问题吗?我已经搜索了互联网,没有回答如何做到这一点。我试图这样玩,因为最终我将从客户端流向客户端,所以我将通过套接字发送阵列。
提前感谢。
答案 0 :(得分:2)
如果我正确理解了这一点(代码示例中有一些缺失部分)......
decodeAudioData
只能解码MP3或WAV等内容。看起来您正在传递原始Int16Array
或Uint16Array
。由于基础ArrayBuffer
不是decodeAudioData
理解的格式,因此它会放弃。
我认为你想要做的是这样的事情:
function playsound( raw ) {
// i'll assume you know how to convert in this direction
// since you have convertFloat32ToInt16
var buffer = convertInt16ToFloat32( raw ),
src = context.createBufferSource(),
audioBuffer = context.createBuffer( 1, buffer.length, context.sampleRate );
audioBuffer.getChannelData( 0 ).set( buffer );
src.buffer = audioBuffer;
src.connect( context.destination );
src.start( 0 );
}
基本上,您已经有办法创建Web Audio API喜欢的原始Float32Array
,因此无需解码(并且无法解码,因为您的数据不是有效的文件格式)。因此,您只需转换回Float32Array
,创建自己的AudioBuffer
,写入buffer
的数据,然后从那里开始。
答案 1 :(得分:1)
为了从float32转换为unsigned int 16,可以将每个float32值与0xffff(最大值为16位)相乘。并且对于int16到float32,这反过来意味着除以0xffff。音频应该没问题了。
我是stackoverflow的新手。我应该把它写成评论,但由于缺乏声誉,我不能。这就是为什么我必须把它写成答案。很抱歉给您带来不便。