Unity 5 - потоковая передача с камеры Unity на смартфон

В настоящее время я разрабатываю симулятор дрона в Unity 5, и у меня в сцене есть 4 камеры Unity. Сейчас я работаю над решением для потоковой передачи экрана одной виртуальной камеры в Unity на мой смартфон Android в реальном времени. Я думал об этих шагах:

  1. Считайте пиксели экрана в пустой Texture2D с помощью Texture2D.ReadPixels

  2. Кодируйте Texture2D с помощью EncodeToJPG или EncodeToPNG

3. Отправьте закодированные байты на устройство (через сокет на устройство; или с помощью этого WebRTC)

  1. На устройстве: считайте байты в изображение (например, используя комбинацию ByteArrayInputStream и BitmapFactory)

Я сделал уже первые два шага. Сейчас я понятия не имею, как работать с сокетами, поэтому использую WebRTC. Но как я могу реализовать код JavaScript в моем проекте Unity? Кто-нибудь может мне с этим помочь?

Я также нашел на форуме WebRTC API, но мои навыки работы с сетью недостаточны. Может кто подскажет, где я в этом коде создаю одноранговое соединение?

Форум: https://forum.unity3d.com/threads/unitypeerjs-simple-webrtc-support-for-unity-webgl.310166/

Код (API WebRTC для Unity): https://www.pastiebin.com/embed/5880b2815c96a


person murcoder    schedule 04.01.2017    source источник
comment
Когда я прочитал ваш вопрос, первое, о чем я подумал, - это создать простое клиент-серверное приложение. Таким образом, вашему клиентскому приложению просто нужно подключиться к серверу и использовать камеру сервера. Сделать должно быть проще   -  person Ludovic Feltz    schedule 04.01.2017
comment
Какую камеру вы используете? Если у вас есть экшн-камера, которая транслирует видео через Wi-Fi, вероятно, вы можете читать поток напрямую, используя любой из видеоплееров, доступных в магазине (например, поиск VLC), или входящий VideoPlayer, доступный в бета-версии 5.6.   -  person Vancete    schedule 05.01.2017
comment
Спасибо всем за ответы. @Vancete Что ты имеешь в виду, какую камеру? В моей сцене сейчас 4 камеры Unity, и одна из них, я хочу отправить одновременно, так что мой смартфон.   -  person murcoder    schedule 19.01.2017
comment
@murcoder вы можете добиться потоковой передачи с камеры? Если да, не могли бы вы сообщить мне, какой подход вы использовали? Я также ищу потоковую передачу с камеры из одного приложения Unity в другое приложение Unity.   -  person chetan rane    schedule 16.10.2019
comment
@chetanrane - это кроссплатформенное потоковое решение с FMETP. вы можете проверить их форум. forum.unity.com/threads/670270   -  person    schedule 07.01.2020


Ответы (1)


Вы не сможете передавать закодированные JPG-файлы с помощью Unity. Одна из основных причин заключается в том, что процесс декодирования JPEG блокирует основной поток до тех пор, пока JPEG не будет декодирован и полученные пиксельные данные не будут загружены на графический процессор - это вызывает серьезные проблемы с производительностью на всех платформах. Кроме того, в настоящее время нет абсолютно надежного варианта потоковой передачи видео с любого типа видеоприемника - где-нибудь в дорожной карте Unity - включить потоковое видео из встроенного видеоплеера.

По состоянию на декабрь 2017 г.

Если ваше Android-приложение не зависит от Unity, вы можете использовать HLS или MPEG-Dash в качестве варианта потоковой передачи - в любом случае вам понадобится видеобуфер, размер которого может составлять всего 5-10 кадров. Один из вариантов - напрямую объединить видеокадры в FFMPEG, что позволит вам демультиплексировать его как поток HLS. Другие варианты, если у вас не очень большие расстояния между исходным устройством и устройством Android, будут потоками RTC или RTSP.

Если вы по-прежнему настаиваете на Unity на Android, возможно, вам повезет с этим активом: https://www.assetstore.unity3d.com/en/#!/content/56355 (они предлагают вам бесплатную и сокращенную версию) - мы довольно часто используем его в производстве, и это позволяет вам кодировщики по умолчанию внутри Unity.

В зависимости от вашего варианта использования будет работать JPEG2000, для которого тогда просто потребуется браузер, на который можно будет ссылаться. JPEG2000 позволяет вам в основном держать открытый сокет, который выбрасывает jpeg-данные. (Unity также не поддерживает это.)

person Mio Bambino    schedule 27.12.2017