android - 如何使用 Oboe(用于 Android 的低延迟音频的 C++ 库)从 DatagramPacket 接收 byte[] 缓冲区?

标签 android c++ java-native-interface datagram oboe

我想在 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/

相关文章:

java - 为什么使用 JUnit 编写测试类时不需要扩展 TestCase?

java - BufferedReader/AsynchTask- java.lang.NullPointerException : lock == null

java - Android & JNI 如何将 Byte[] 数据数组传递给 JNI 并取回 Byte[]

java - Tomcat 上的 JNI 发生 fatal error

java - 当应用程序失焦(非 Activity )时响应按键事件

java - 如何在Parcelable类中实现读写

java - 降低 uri 图像质量以减小文件大小

c++ - 在 C++11 中,是否可以将模板函数包装在 std::function 中?

c++ - 一个作家许多读者发行 map

c++ - 使用 C++17 编译时无法从基类访问成员类型