IP-камера в Unity3D

Я пытаюсь получить представление в Unity3D с помощью IP-камеры. Только когда я использую URL-адрес для доступа к камере с помощью сценария (см. Ниже), он выдает ошибку 401 Unauthorized. Теперь мне нужно войти в систему с паролем и именем пользователя, оба администратора.

Но я не уверен, как поместить это в 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;
}

Есть идеи, что происходит?


person Sem Abraham    schedule 02.07.2014    source источник


Ответы (2)


Используйте 1_. Пример в документации выполняет базовую аутентификацию 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.

person Krzysztof Bociurko    schedule 02.07.2014
comment
Отредактировал мой пост под строкой '=', есть идеи? - person Sem Abraham; 03.07.2014
comment
Я добавил новый код, большое спасибо за это, кстати! Но это дает еще две ошибки, которые, я думаю, связаны». 'Активы/скрипты/SEMTEX.cs(28,27): ошибка CS1502: лучший перегруженный метод, соответствующий UnityEngine.WWW.WWW(string, byte[], System.Collections.Hashtable)' has some invalid arguments' and 'Assets/Scripts/SEMTEX.cs(28,27): error CS1503: Argument #3', не может преобразовать System.Collections.Generic.Dictionary<string,string>' expression to type System.Collections.Hashtable'' - person Sem Abraham; 07.07.2014
comment
Я также отредактировал строку URL, имени пользователя и пароля, чтобы сказать admin, как и должно быть. Вот так: общедоступная строка uri = 192.168.0.50/snapshot.cgi; общедоступная строка имя пользователя = admin; пароль общедоступной строки = admin; - person Sem Abraham; 07.07.2014
comment
Какая у вас версия unity3d? Похоже, они изменили API на 4.5. Также: попытался перейти на 4.3.4f1, и отправка заголовков кажется нарушенной. Вы должны обновить до 4.5, если это возможно. - person Krzysztof Bociurko; 07.07.2014
comment
Теперь это работает! Большое спасибо! Это действительно была версия Unity, я только что обновился, так что все в порядке. - person Sem Abraham; 07.07.2014

В дополнение к ответу Кшиштофа замените метод OnGUI(), чтобы наложить изображение с камеры на внутриигровой объект (например, на экран игрового телевизора), вместо того, чтобы рисовать его на весь экран.

public GameObject displayPlane;

public void OnGUI()
{
    displayPlane.GetComponent<Renderer>().material.mainTexture = cam;
}
person Edwin Chua    schedule 07.04.2017