IP-камера в Unity3D
Я пытаюсь получить представление в Unity3D с помощью IP-камеры. Только когда я использую URL для доступа к камере с помощью скрипта (см. Ниже), это дает 401 несанкционированную ошибку. Теперь мне нужно войти с паролем и именем пользователя, оба admin.
Но я не уверен, как поместить это в URL, какая-нибудь помощь с этим? Посмотрите код ниже на то, что у меня пока.
//#pragma strict
// http://docs.unity3d.com/Documentation/ScriptReference/WWW.LoadImageIntoTexture.html
var url = "http://192.168.1.30/admin/view.cgi?profile=2&language=en";
function Start () {
// Create a texture in DXT1 format
// NOTE: you may want to experiment with different texture formats, specially in a web context
// https://docs.unity3d.com/Documentation/ScriptReference/TextureFormat.html
renderer.material.mainTexture = new Texture2D(4, 4, TextureFormat.DXT1, false);
Debug.Log(adress);
Debug.Log(url);
while(true) {
// Start a download of the given URL
var www = new WWW(url);
// wait until the download is done
yield www;
// assign the downloaded image to the main texture of the object
www.LoadImageIntoTexture(renderer.material.mainTexture);
}
}
==============================================
Так что теперь я использую WWWForm.Headers. Тем не менее, когда я помещаю его в свой код, он дает мне "Инициализатор поля не может ссылаться на метод или свойство поля"
Код является:
открытый класс SEMTEX: MonoBehaviour {
// Use this for initialization
//void Start() {
public WWWForm form = new WWWForm ();
public string headers = form.headers;
public byte[] rawData = form.data;
public string url = "http://192.168.1.101/snapshot.cgi";
public WWW www = new WWW (url, rawData, headers);
//}
IEnumerator Update (){
form.AddField ("name", "value");
headers ["Authorization"] = "Basic " + System.Convert.ToBase64String (System.Text.Encoding.ASCII.GetBytes ("admin:admin"));
yield return www;
}
Есть идеи, что происходит?
2 ответа
Использование WWWForm.headers
, Пример в документации делает основную аутентификацию HTTP.
Кроме того, если вы планируете часто обновлять изображение, используя несжатую текстуру, такую как TextureFormat.RGB24
должно быть намного быстрее.
Документы Unity были довольно устаревшими, поэтому вот полный скрипт, который постоянно обновляет веб-камеру и рисует ее на экране:
using UnityEngine;
using System.Collections;
public class HttpWebcam : MonoBehaviour {
public string uri;
public string username;
public string password;
Texture2D cam;
public void Start() {
cam=new Texture2D(1, 1, TextureFormat.RGB24, false);
StartCoroutine(Fetch());
}
public IEnumerator Fetch() {
while(true) {
Debug.Log("fetching... "+Time.realtimeSinceStartup);
WWWForm form = new WWWForm();
form.AddField("dummy", "field"); // required by WWWForm
WWW www = new WWW(uri, form.data, new System.Collections.Generic.Dictionary<string,string>() { // using www.headers is depreciated by some odd reason
{"Authorization", "Basic " + System.Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes(username+":"+password))}
});
yield return www;
if(!string.IsNullOrEmpty(www.error))
throw new UnityException(www.error);
www.LoadImageIntoTexture(cam);
}
}
public void OnGUI() {
GUI.DrawTexture(new Rect(0,0,Screen.width,Screen.height), cam);
}
}
Для запуска просто перетащите в GameObject и укажите любой URI, содержащий PNG или JPEG. Он также может получить доступ к ресурсам, которые не защищены паролем (пароль игнорируется). Для примера вы можете использовать: http://www.sudftw.com/imageppc.php
,
Добавляя к ответу Кшиштофа, замените OnGUI()
метод наложения видеокамеры на игровой объект (например, на игровой телевизионный экран) вместо рисования на весь экран.
public GameObject displayPlane;
public void OnGUI()
{
displayPlane.GetComponent<Renderer>().material.mainTexture = cam;
}