Я предполагаю, что это камера с портом 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 кадр).
Ваши графические байты должны выглядеть примерно так:
0xFF
0xD8
someotherbytes (тысячи их) ..... то 0xFF
0xD9
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, и вы должны, если вы не можете сделать шаг , , и .