在我的 Android 应用程序中,我使用 AudioRecord 并将一个字节数组 PCM_16 连续发送到 Node.js 服务器。
byte[] audioBuffer = new byte[mAudioBufferSampleSize];
mAudioRecord.startRecording();
int audioRecordingState = mAudioRecord.getRecordingState();
if (audioRecordingState != AudioRecord.RECORDSTATE_RECORDING) {
Log.e(TAG, "AudioRecord is not recording");
return;
} else {
Log.v(TAG, "AudioRecord has started recording...");
}
while (inRecordMode) {
int samplesRead = mAudioRecord.read(audioBuffer, 0,
mAudioBufferSampleSize);
Log.v(TAG, "Got samples: " + samplesRead);
if (WebSocketManager.roomSocket.isConnected()) {
WebSocketManager.roomSocket.send(audioBuffer);
}
}
之后,我可以将它以 ArrayBuffer 类型流式传输到 Web 浏览器,并尝试将其转换为 Float32Array 以作为 AudioContext 实例的缓冲区。但我听不到任何声音或噪音。
function onMessage(evt) {
var context = new AudioContext();
var source = context.createBufferSource();
source.connect(context.destination);
array = new Int8Array(evt.data);
abs = new Float32Array(evt.data);
arrays = new Float32Array(abs.length);
ab = context.createBuffer(1, array.length, 44100);
ab.getChannelData(0).set(arrays);
source.buffer = ab;
source.start(0);
// then do it
}
所以有人可以给我预付款吗? P/s: 使用decodeAudioData 只报null 错误
抱歉我的英语不好
最佳答案
您得到的数组是每个样本 0-32k(uint16 的范围)。 AudioBuffer channel 数据中的每个样本都是 float32 - 标称范围为 -1 到 +1。
您需要对每个样本中的数据进行转换,而不仅仅是赋值和依赖转换。
关于javascript - 我如何在 Web 中播放来自 Android 的原始样本 PCM_16 音频数据记录(使用 Web-Audio 或其他)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22895657/