从超强的AndroidAudioIO输入读取缓冲区

Reading buffer from SuperpoweredAndroidAudioIO input?

本文关键字:输入 读取 缓冲区 AndroidAudioIO      更新时间:2023-10-16

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

基本上,我想使用超能力和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发送数据。