繁体   English   中英

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

[英]How to use Oboe (the C++ library for low latency audio for Android) to receive the byte[] buffer from DatagramPacket?

我想在 2 个 Android 设备之间通过 WiFi 进行音频直播。

为了减少音频延迟,应用双簧管 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池。 这些对象包装了一大块本机内存,可以直接从 C++ 访问。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM