2016-09-14 7 views
3

Предположим, у меня есть беспроводная камера, в которой я хочу передавать кадры из одного в единое целое в реальном времени. Есть ли способ достичь этого?Потоковое видео в реальном времени с камеры на Unity3D

Бонус вопросы:

  • насчет камер с более широкими углами (180, возможно, даже 360)
  • Сколько вопроса будет задержка, если это кадры я хочу быть взаимодействующим с
  • Возможно отправить больше данных, таких как восприятие глубины (с использованием камеры восприятия глубины), кроме обычных кадров?
  • Я сошел с ума или это было сделано?

Заранее спасибо

ответ

3

Я предполагаю, что это камера с портом Ethernet или Wi-Fi, что вы можете подключиться и поток изображений с ней жить.

Если да, то да, это можно сделать с помощью Unity.

Как это делается без внешней библиотеки:

Подключение к камере:

.Подключать к-той же локальной сети с камерой или если unpn поддерживается, вы также можете подключиться к нему через Интернет. Обычно для этого вам нужен IP и порт камеры. Предположим, что IP-адрес камеры равен 192.168.1.5, а номер порта - 900. Ссылка для подключения - http://192.168.1.5:900.

Иногда это просто URL, который заканчивается .mjpg или .bin, такие как http://192.168.1.5/mjpg/video.mjpg и http://192.168.1.5/mjpg/video.bin

Каждая камера отличается. Единственный способ найти URL-адрес - прочитать его руководство. Если руководство недоступно, подключитесь к нему с его официальным приложением, а затем используйте Wireshack, чтобы открыть URL-адрес камеры. username и password (при необходимости) также можно найти в руководстве. Если недоступно, укажите номер модели и все, что вам нужно.

Извлечение JPEG из камеры:

При подключении к камере, камера будет представляемой бесконечные данными для вас. Эти данные можно сканировать и извлекать из него.

. Поиск заголовка JPEG, который является 0xFF, а затем 0xD8. Если эти два байта находятся рядом друг с другом, начните читать байты и продолжайте сохранять их в массиве. Вы можете использовать переменную index (int), чтобы подсчитывать, сколько байтов вы получили.

int counter = 0; 
byte[] completeImageByte = new byte[500000]; 
byte[] receivedBytes = new byte[500000]; 
receivedBytes[counter] = byteFromCamera; 
counter++; 

.При чтении данных с камеры проверьте, являются ли следующие два байта нижним колонтитулом JPEG, который равен 0xFF, а затем 0xD9. Если это правда, вы получили полное изображение (1 кадр).

Ваши графические байты должны выглядеть примерно так:

0xFF0xD8 someotherbytes (тысячи их) ..... то 0xFF0xD9

Copy receivedBytes переменной completeImageByte так, что он может быть использован для отображения изображение позже. Сбросить counter переменную в 0.

Buffer.BlockCopy(receivedBytes, 0, completeImageByte, 0, counter); 
counter = 0; 

Отображение изображения JPEG на экране:

.Display Образ экранировать

Поскольку вы будете получать много изображений в секунду, самый efficient способ, который я нашел для отображения, это использовать RawImage Компонент. Поэтому не используйте для этого Image или Sprite Renderer, если вы хотите, чтобы это выполнялось на мобильных устройствах.

public RawImage screenDisplay; 
if(updateFrame){ 
Texture2D camTexture = new Texture2D(2, 2); 
camTexture.LoadImage(completeImageByte); 
screenDisplay.texture = camTexture; 
} 

Вам нужно сделать camTexture = new Texture2D(2, 2); один раз в функции Start() только.

.Jump назад к шагу и продолжать делать это до тех пор, пока вы хотите совсем.

API для подключения к камере:.

Используйте камеру HttpWebRequest, если камера требует аутентификации (имя пользователя и пароль).

Для тех, кто не требует аутентификации, используйте UnityWebRequest. При использовании UnityWebRequest вы должны получить свои собственные классы от DownloadHandlerScript или ваше приложение будет аварийно завершено, так как вы будете получать данные без остановок.

Пример получения собственного класса от DownloadHandlerScript:

using UnityEngine; 
using System.Collections; 
using UnityEngine.Networking; 

public class CustomWebRequest : DownloadHandlerScript 
{  
    // Standard scripted download handler - will allocate memory on each ReceiveData callback 
    public CustomWebRequest() 
     : base() 
    { 
    } 

    // Pre-allocated scripted download handler 
    // Will reuse the supplied byte array to deliver data. 
    // Eliminates memory allocation. 
    public CustomWebRequest(byte[] buffer) 
     : base(buffer) 
    { 
    } 

    // Required by DownloadHandler base class. Called when you address the 'bytes' property. 
    protected override byte[] GetData() { return null; } 

    // Called once per frame when data has been received from the network. 
    protected override bool ReceiveData(byte[] byteFromCamera, int dataLength) 
    { 
     if (byteFromCamera == null || byteFromCamera.Length < 1) 
     { 
      //Debug.Log("CustomWebRequest :: ReceiveData - received a null/empty buffer"); 
      return false; 
     } 

     //Search of JPEG Image here 

     return true; 
    } 

    // Called when all data has been received from the server and delivered via ReceiveData 
    protected override void CompleteContent() 
    { 
     //Debug.Log("CustomWebRequest :: CompleteContent - DOWNLOAD COMPLETE!"); 
    } 

    // Called when a Content-Length header is received from the server. 
    protected override void ReceiveContentLength(int contentLength) 
    { 
     //Debug.Log(string.Format("CustomWebRequest :: ReceiveContentLength - length {0}", contentLength)); 
    } 
} 

Использование:

using UnityEngine; 
using System.Collections; 
using UnityEngine.Networking; 

public class Test : MonoBehaviour 
{ 

    CustomWebRequest camImage; 
    UnityWebRequest webRequest; 
    byte[] bytes = new byte[90000]; 

    void Start() 
    { 
     string url = "http://camUrl/mjpg/video.mjpg"; 
     webRequest = new UnityWebRequest(url); 
     webRequest.downloadHandler = new CustomWebRequest(bytes); 
     webRequest.Send(); 
    } 
} 

Вы можете их выполнить шаг , , и в ReceiveData функция из сценария CustomWebRequest.

Управление камерой:

Камеры имеют команды для перемещения, поворот, зеркальное отражение, зеркало и выполнять другие function.This отличается в каждой камере, но это просто, как сделать запрос GET/POST к URL из камеры и предоставления запросов.Эти команды можно найти в руководстве камеры.

Например: http://192.168.1.5?pan=50&rotate=90

Другие Каркасы:

AForge - Свободная структура, которая может обрабатывать как JPEG/MJPES и FFMPEG из камеры. Вы должны изменить его для работы с Unity, и вы должны, если вы не можете сделать шаг , , и .

Смежные вопросы