0

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

基本上我想使用 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 代码相比),如果可以,可能会提示从哪里开始。谢谢。

4

1 回答 1

0

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

于 2017-06-11T11:05:23.527 回答