#android #c #java-native-interface #datagram #oboe
#Android #c #java-native-интерфейс #дейтаграмма #oboe
Вопрос:
Я хотел бы транслировать аудио в прямом эфире по Wi-Fi между 2 устройствами Android.
Чтобы уменьшить задержку звука, применение библиотеки Oboe C кажется правильным направлением.
Моя текущая структура заключается в использовании DatagramPacket для передачи и приема аудиоданных. Тип данных буфера, содержащего входящую дейтаграмму, — byte[] . Согласно моему исследованию, мне нужно передать данные из буфера byte [] через JNI (собственный интерфейс Java), а затем прочитать данные в неблокирующую очередь? (например: https://github.com/google/oboe/blob/master/samples/RhythmGame/src/main/cpp/utils/LockFreeQueue.h )
Если я правильно понимаю, в C нет типа данных byte[], поэтому я должен преобразовать byte[] (jbyteArray в JNI) в тип данных (например: int16_t)?
Однако я не очень уверен, как реализовать такое преобразование? Или даже я в неправильном направлении?
Любые предложения или примеры кода будут высоко оценены!
Большое вам спасибо!
Комментарии:
1. вы решили проблему? можете ли вы поделиться тем, как с этим справиться? Спасибо
Ответ №1:
Я предлагаю вам изучить возможность использования пула прямых ByteBuffer
файлов. Эти объекты заключают в себе большой объем встроенной памяти и могут быть доступны непосредственно из C .
Когда вы получаете пакет из сети, возьмите бесплатный ByteBuffer из пула, скопируйте в него содержимое пакета и пометьте буфер как взятый каким-либо образом. (добавив его в taken
очередь?) Затем добавьте указатель размер в очередь, к которой C может получить доступ.
В onAudioReady
обратном вызове Oboe вы можете просто удалить элементы из этой очереди и скопировать их содержимое в буфер данных Oboe. Сообщите миру Java, сколько элементов было израсходовано, чтобы он мог повторно использовать буферы обратно в свободный пул.