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;
}
Другие вопросы по тегам