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