从 SuperpoweredAndroidAudioIO 输入读取缓冲区?

Reading buffer from SuperpoweredAndroidAudioIO input?

我正在尝试制作一个从麦克风获取音频信号的应用程序(使用 Superpowered),然后将其推送到数据报数据包中进行发送。 据我所知,我应该使用 SuperpoweredAndroidAudioIO class 作为输入,但我不知道如何读取它的缓冲区来发送它。

基本上我想使用 Superpowered 和 C++ 实现与此类似的东西:

...
recBufSize = AudioRecord.getMinBufferSize(frequency, channelConfiguration, 
audioEncoding);
audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, frequency, 
channelConfiguration, audioEncoding, recBufSize);    

new Thread(){
        byte[] buffer = new byte[recBufSize];
        public void run(){
            try {
                 datagramSocket = new DatagramSocket();
            } catch (SocketException e) {
                e.printStackTrace();
            }

            audioRecord.startRecording();
            isRecording = true;

            while (isRecording){
                int readSize = audioRecord.read(buffer, 0, buffer.length);

                try {
                    DatagramPacket packet = new DatagramPacket(
                            buffer, readSize, receiverAddress, port);

                    datagramSocket.send(packet);

                } catch (IOException e) {
                    e.printStackTrace();
                }
           }
            datagramSocket.close();
        }
    }.start();

我是 JNI 和 NDK 的新手,所以我只想知道这是否可能或合理以减少延迟(与使用 Java 代码相比),如果是的话,可能会有一个小提示从哪儿开始。谢谢

这绝对是可能的,而且还会减少延迟。然而,实施起来要复杂得多。不建议在音频处理回调中阻塞,因此您需要一些无锁机制将音频从音频处理回调发送到另一个线程。然后在另一个线程中使用标准 BSD 套接字通过 UDP 发送数据。