2

我想在 2 个 Android 设备之间通过 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[] 数据类型,所以我必须将 byte[](JNI 中的 jbyteArray)转换为数据类型(例如:int16_t)?

但是,我不太清楚如何实现这样的转换?还是我走错了方向?

任何建议或示例代码将不胜感激!

非常感谢!

4

1 回答 1

1

我建议您考虑使用一个 direct 池ByteBuffer。这些对象包装了一块本机内存,可以直接从 C++ 访问。

当您从网络接收到一个数据包时,从池中取出一个空闲的 ByteBuffer,将数据包内容复制到其中,并以某种方式将缓冲区标记为已占用。(通过将其添加到taken队列中?)然后,将指针 + 大小添加到 C++ 可以访问的队列中。

在 OboeonAudioReady回调中,您可以简单地从队列中取出元素并将其内容复制到 Oboe 的数据缓冲区。告诉 Java 世界消耗了多少元素,以便它可以将缓冲区回收回空闲池。

于 2020-11-23T08:34:00.150 回答