我想在两个安卓设备之间通过WiFi进行音频直播。
为了减少音频延迟,应用Oboe C++库似乎是一个正确的方向。
我目前的结构是使用DatagramPacket来发送和接收音频数据。保存传入数据报的缓冲区的数据类型为byte[]。根据我的研究,我需要通过JNI (Java Native Interface)从byte[]缓冲区传递数据,然后将数据读取到非阻塞队列中。(例如:https://github.com/google/oboe/blob/master/samples/RhythmGame/src/main/cpp/utils/LockFreeQueue.h)
如果我理解正确,C++中没有byte[]数据类型,所以我必须将字节jbyteArray in JNI转换为数据类型(例如: int16_t)?
但是,我不是很确定如何实现这样的转换?或者甚至我走错了方向?
任何建议或示例代码将非常感谢!
非常感谢!
发布于 2020-11-23 16:34:00
我建议你考虑使用一个直接的ByteBuffer池,这些对象包装了一个本机内存的blob,可以直接从C++访问。
当您收到来自网络的数据包时,从池中获取一个空闲的ByteBuffer,将数据包内容复制到其中,并将缓冲区标记为以某种方式占用。(通过将其添加到taken队列?)然后,将指针+大小添加到C++可以访问的队列。
在Oboe onAudioReady回调中,您可以简单地从该队列中取出元素,并将其内容复制到Oboe的数据缓冲区中。告诉Java世界消耗了多少元素,这样它就可以将缓冲区回收到空闲池。
https://stackoverflow.com/questions/64958025
复制相似问题