0
在我的Android应用程序中,我使用AudioRecord并连续发送一个字节数组PCM_16到Node.js服务器。如何在Web中使用Web(使用Web-Audio或其他)播放原始样本PCM_16音频数据记录?
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类型的网页浏览器,并尝试将其转换为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只给一个空的错误
对不起,我的英文不好
在java中的字节范围从-128到127,所以为什么我得到的数组是每个样本0-32k,你能解释给我吗? – bhINC
如果是16位,每个采样应该是两个字节 - 因此范围应该是-32k到+32k。样本的数学应该是sampleInFloat =(sampleInInt-32768)/ 32768。 – cwilso
哦,数组的范围是从-32768到32767.所以现在,我可以使用数组[i] = array [i]/32768.0将其转换为audioBuffer。但音频可以在突然停止之前在短时间内播放。你如何看待这个问题? P/s:感谢您的热情。 (希望我正确地写出来) – bhINC