javascript - 我如何在 Web 中播放来自 Android 的原始样本 PCM_16 音频数据记录(使用 Web-Audio 或其他)?

标签 javascript android web-audio-api

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

相关文章:

javascript - 类型错误 : Illegal invocation on function alias

android - 当屏幕锁定在 native 上时如何显示来电

javascript - 录制音频、同步循环、偏移延迟和导出部分

web-audio-api - 有没有办法在网络 worker 中使用 AudioContext

javascript - 仅在特定字符之间出现时替换文本

javascript - animate() 更新速度不够快

JavaScript:如何测试clearInterval函数是true还是false

android - onStop() 没有被调用?

android - 未经下载许可在Android市场上发布应用程序

javascript - 通过 Redux 中的回调分派(dispatch)操作