找回密码
 立即注册
查看: 384|回复: 0

Action One 之 2018Unity 安卓sdk 开发云台指南

[复制链接]
发表于 2022-3-15 12:29 | 显示全部楼层 |阅读模式
Unity 萤石云 监控 Http 云台

控制器


导入sdk 包,加入眼睛 控制器: Unity导航栏中即会出现Tools工具,子级出现ShadowCreator--Action
http插件

资料


新版的SDK,可是确保起见,我用的依旧是旧版mem
1.关于新版本的sdk

2.  云台控制http请求官方文档


请求接口播放地址
            "liveAddress": //HLS流畅直播地址"http://hls.open.ys7.com/openlive/ed98eeead4c843f898fef1c203313364.m3u8",            "hdAddress": //HLS高清直播地址"http://hls.open.ys7.com/openlive/ed98eeead4c843f898fef1c203313364.hd.m3u8",            "rtmp": //RTMP流畅直播地址"rtmp://rtmp.open.ys7.com/openlive/ed98eeead4c843f898fef1c203313364",            "rtmpHd": // RTMP高清直播地址"rtmp://rtmp.open.ys7.com/openlive/ed98eeead4c843f898fef1c203313364.hd"
视频流的播放格式 不能够使用Unity自封装的VideoPlayer组件,那是用来播放MP4格式的视频的,不能用于flv,m3u8...
官方购买插件AVPro       ------  AVpro v1.9.4
3. 踩过的一个坑 **


965b9c0aaf5ea32bd466d54d390c435.png

朋友分享给我的低版本,电脑端可以,打包到安卓平台 就会被kill,这不就提示我更新插件了米啊!@!
安卓打包需要添加一个环境
Androidmainfest文件中增加访问的控制权限


网络访问的权限
<?xml version="1.0" encoding="utf-8"?><!-- GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN--><manifest    xmlns:android="http://schemas.android.com/apk/res/android"    package="com.unity3d.player"    xmlns:tools="http://schemas.android.com/tools">    <application>        <activity android:name="com.unity3d.player.UnityPlayerActivity"                  android:theme="@style/UnityThemeSelector" android:usesCleartextTraffic="true">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>            <meta-data android:name="unityplayer.UnityActivity" android:value="true" />        </activity>    </application></manifest>4. http请求

using System;using System.Collections;using System.Collections.Generic;using LitJson;using RenderHeads.Media.AVProVideo;using UnityEngine;using UnityEngine.Events;using UnityEngine.Networking;using UnityEngine.UI;/// <summary>/// 2022 3-12/// http 项目 萤石云视频监控开发 主控制脚本/// </summary>public class Manager : MonoBehaviour{    //属性    private MediaPlayer _mediaPlayer;    private MediaPath path;    string IP = "https://open.ys7.com/"; //http    string http_Url; //请求地址    //appKey和secret可以在官网-开发者服务-我的应用中找到    private string appKey = "752b5e8312094b5bb76b2****";    private string appSecret = "7bcffd435aa12fb73e3bb****";    //根据appKey和secret获取accessToken    string getToken_url = "api/lapp/token/get";    string accessToken;    // private string getAddress_Url="lapp/v2/live/address/get";    private string deviceSerial = "C78957921"; //设备序列号,存在英文字母的设备序列号,字母需为大写    private int channelNo = 1; //   通道号 默认为1    string url = "http://hls01open.ys7.com/openlive/1adff11698b64e228892****a8ca.m3u8"; //视频播放地址        private Text msg;        //startButton    private GameObject game;    private Button startButton;    // 方法    void Start()    {        _mediaPlayer = FindObjectOfType<MediaPlayer>();        StartCoroutine(GetToken());        msg = _mediaPlayer.GetComponentInChildren<Text>();        // game = GameObject.Find("MediaPlayerUI 1/Video/VideoDisplay/Game").gameObject;        // game.gameObject.SetActive(true);//自定义  按钮        // startButton = GameObject.Find("MediaPlayerUI 1/Video/VideoDisplay/Game/StartBtn").GetComponent<Button>();        // startButton.onClick.AddListener(startBtn);    }    /// <summary>    /// 获取accessToken    /// 有效期是7天,请在即将过期或者接口报错10002时重新获取,每个token具备独立的7天生命周期,请勿频繁调用避免占用过多接口调用次数。    /// </summary>    /// <returns></returns>    IEnumerator GetToken(Action<loginManager> callBack = null)    {        //post 提交方式 采用表单的方式        WWWForm form = new WWWForm();        form.AddField("appKey", appKey);        form.AddField("appSecret", appSecret);        http_Url = IP + getToken_url;        UnityWebRequest request = UnityWebRequest.Post(http_Url, form);        yield return request.SendWebRequest();        if (!request.isNetworkError && !request.isHttpError)        {            if (request.responseCode == 200)            {                string s = request.downloadHandler.text;                // Debug.Log("客户端已经接受http的登录请求:" + s);                Http_Login ht = JsonMapper.ToObject<Http_Login>(s);                accessToken = ht.data.accessToken;            }            var response = JsonMapper.ToObject<loginManager>(request.downloadHandler.text);            // Debug.Log(response);            if (callBack != null)            {                callBack(response);            }        }        else        {            Debug.LogError($"发起网络请求失败: 确认登录接口 -{request.error}");        }        StartCoroutine(GetLive());    }    /// <summary>    /// 获取用户下直播视频列表    /// 该接口适用于已经开通过直播的用户,用以获取账号下的视频地址列表。    /// </summary>    /// <returns></returns>    IEnumerator GetLive(Action<loginManager> callBack = null)    {        //post 提交方式 采用表单的方式        WWWForm form = new WWWForm();        form.AddField("accessToken", accessToken);        // string http_Url1 ="https://open.ys7.com/api/lapp/live/video/list";        string http_Url1 = IP + "api/lapp/live/video/list";        UnityWebRequest request = UnityWebRequest.Post(http_Url1, form);        yield return request.SendWebRequest();        if (!request.isNetworkError && !request.isHttpError)        {            if (request.responseCode == 200)            {                string s = request.downloadHandler.text;                // Debug.Log("客户端已经接受http的获取用户下直播视频列表请求:" + s);                Http_Get ht = JsonMapper.ToObject<Http_Get>(s);                deviceSerial = ht.data[0].deviceSerial;                channelNo = ht.data[0].channelNo;                url = ht.data[0].hdAddress;                Play();            }            var response = JsonMapper.ToObject<loginManager>(request.downloadHandler.text);            // Debug.Log(response);            if (callBack != null)            {                callBack(response);            }        }        else        {            Debug.LogError($"发起网络请求失败: 确认登录接口 -{request.error}");        }        //StartCoroutine(getAddress());    }    /// <summary>    /// 获取播放地址    /// form     /// deviceSerial 设备序列号,存在英文字母的设备序列号,字母需为大写    /// </summary>    /// <returns></returns>    IEnumerator getAddress(Action<loginManager> callBack = null)    {        //post 提交方式 采用表单的方式        WWWForm form = new WWWForm();        form.AddField("accessToken", accessToken);        form.AddField("deviceSerial", deviceSerial);        http_Url = "https://open.ys7.com/api/lapp/v2/live/address/get";        // http_Url = IP + address_url;        UnityWebRequest request = UnityWebRequest.Post(http_Url, form);        yield return request.SendWebRequest();        if (!request.isNetworkError && !request.isHttpError)        {            if (request.responseCode == 200)            {                string s = request.downloadHandler.text;                Debug.Log("客户端已经接受http的请求:" + s);                Http_GetUrl ht = JsonMapper.ToObject<Http_GetUrl>(s);                url = ht.data.url;                Debug.LogError("url:" + url);                Play();            }            var response = JsonMapper.ToObject<loginManager>(request.downloadHandler.text);            // Debug.Log(response);            if (callBack != null)            {                callBack(response);            }        }        else        {            Debug.LogError($"发起网络请求失败: 确认登录接口 -{request.error}");        }    }    /// <summary>    /// 播放视频    /// </summary>    void Play()    {        _mediaPlayer.OpenMedia(new MediaPath(url, MediaPathType.AbsolutePathOrURL), autoPlay: true);    }//操作命令:0-上,1-下,2-左,3-右,4-左上,5-左下,6-右上,7-右下,8-放大,9-缩小,10-近焦距,11-远焦距    private int direction;    private string code;    public void startBtn()    {        Debug.LogError("开始云台控制 ");        StartCoroutine(StopPtz());    }    /// <summary>    /// 云台    /// 开始云台控制     -----------------先调用停止云台控制接口    /// https://open.ys7.com/api/lapp/device/ptz/start    ///        /// direction   操作命令:0-上,1-下,2-左,3-右,4-左上,5-左下,6-右上,7-右下,8-放大,9-缩小,10-近焦距,11-远焦距    /// speed       云台速度:0-慢,1-适中,2-快,海康设备参数不可为0    /// </summary>    /// <returns>code 返回码  msg 返回消息</returns>    IEnumerator StartPtz(Action<loginManager> callBack = null)    {        //post 提交方式 采用表单的方式        WWWForm form = new WWWForm();        form.AddField("accessToken", accessToken);        form.AddField("deviceSerial", deviceSerial);        form.AddField("channelNo", channelNo);        form.AddField("direction", direction);        form.AddField("speed", 2);        http_Url = "https://open.ys7.com/api/lapp/device/ptz/start";        UnityWebRequest request = UnityWebRequest.Post(http_Url, form);        yield return request.SendWebRequest();        if (!request.isNetworkError && !request.isHttpError)        {            if (request.responseCode == 200)            {                string s = request.downloadHandler.text;                Debug.Log("客户端已经接受http的云台控制请求:" + s);                PtzCode ht = JsonMapper.ToObject<PtzCode>(s);                code = ht.code;                msg.text = ht.msg;                Debug.LogError("text:" + msg.text);            }            var response = JsonMapper.ToObject<loginManager>(request.downloadHandler.text);            if (callBack != null)            {                callBack(response);            }        }        else        {            Debug.LogError($"发起网络请求失败: 确认登录接口 -{request.error}");        }    }        /// <summary>    /// 停止云台控制    /// 设备停止云台控制    /// https://open.ys7.com/api/lapp/device/ptz/stop    ///    /// channelNo 通道号  默认为    /// direction   操作命令:0-上,1-下,2-左,3-右,4-左上,5-左下,6-右上,7-右下,8-放大,9-缩小,10-近焦距,11-远焦距    /// </summary>    /// <returns></returns>    IEnumerator StopPtz(Action<loginManager> callBack = null)    {        //post 提交方式 采用表单的方式        WWWForm form = new WWWForm();        form.AddField("accessToken", accessToken);        form.AddField("deviceSerial", deviceSerial);        form.AddField("channelNo", channelNo);        form.AddField("direction", direction);        http_Url = "https://open.ys7.com/api/lapp/device/ptz/stop";        UnityWebRequest request = UnityWebRequest.Post(http_Url, form);        yield return request.SendWebRequest();        if (!request.isNetworkError && !request.isHttpError)        {            if (request.responseCode == 200)            {                string s = request.downloadHandler.text;                Debug.Log("客户端已经接受设备停止云台控制:" + s);                PtzCode ht = JsonMapper.ToObject<PtzCode>(s);                code = ht.code;                msg.text = ht.msg;                Debug.LogError("text:" + msg.text);                                //先调用停止云台控制接口                StartCoroutine(StartPtz());            }            var response = JsonMapper.ToObject<loginManager>(request.downloadHandler.text);            if (callBack != null)            {                callBack(response);            }        }        else        {            Debug.LogError($"发起网络请求失败: 确认登录接口 -{request.error}");        }    }    private int command;    /// <summary>    /// 对设备进行镜像翻转操作(需要设备支持)。    /// </summary>    /// <param name="callBack"></param>    /// form :    /// accessToken 授权过程获取的access_token    /// deviceSerial 设备序列号,存在英文字母的设备序列号,字母需为大写    /// channelNo 通道号    /// command  镜像方向:0-上下, 1-左右, 2-中心    /// <returns></returns>    IEnumerator mirrorPtz(Action<loginManager> callBack = null)    {        //post 提交方式 采用表单的方式        WWWForm form = new WWWForm();        form.AddField("accessToken", accessToken);        form.AddField("deviceSerial", deviceSerial);        form.AddField("channelNo", channelNo);        form.AddField("command", command);        http_Url = "https://open.ys7.com/api/lapp/device/ptz/mirror";        UnityWebRequest request = UnityWebRequest.Post(http_Url, form);        yield return request.SendWebRequest();        if (!request.isNetworkError && !request.isHttpError)        {            if (request.responseCode == 200)            {                string s = request.downloadHandler.text;                Debug.Log("客户端已经接受对设备进行镜像翻转操作:" + s);            }            var response = JsonMapper.ToObject<loginManager>(request.downloadHandler.text);            if (callBack != null)            {                callBack(response);            }        }        else        {            Debug.LogError($"发起网络请求失败: 确认登录接口 -{request.error}");        }    }}//定义类public class Data{    public string accessToken;    public string deviceSerial;    public int channelNo;    public string url;        public string hdAddress;//  HLS高清直播地址    public string code;    public string msg;}public class PtzCode{    public Data data;    public string code;    public string msg;}public class Http_GetUrl{    public Data data;    public string id;    public string url;    public long expireTime;}public class Http_Get {    public List<Data> data;    public string deviceSerial;    public int channelNo;    public string deviceName;    public string liveAddress;//HLS流畅直播地址    public string hdAddress;//  HLS高清直播地址    public string rtmp;//   RTMP流畅直播地址    public string rtmpHd;// RTMP高清直播地址    public long beginTime;//开始时间,long格式如1472694964067,精确到毫秒,该字段已无效,将在2017年6月1号去掉    public long endTime;//过期时间,long格式如1472794964067,精确到毫秒,该字段已无效,将在2017年6月1号去掉    public int status;    public int  exception;}public class loginManager{    public List<Data> data;    public string msg;    public string code;}public class Http_Login{    public Data data;    public string accessToken;//获取的accessToken    public long expireTime;//具体过期时间,精确到毫秒}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-9-22 16:35 , Processed in 0.091433 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表