从 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 发送数据。
我正在尝试制作一个从麦克风获取音频信号的应用程序(使用 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 发送数据。