美文网首页Unity
Action One 之 2018Unity 安卓sdk 开发云

Action One 之 2018Unity 安卓sdk 开发云

作者: 荼蘼toome | 来源:发表于2022-03-15 10:55 被阅读0次

    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;//具体过期时间,精确到毫秒
    }
    

    相关文章

      网友评论

        本文标题:Action One 之 2018Unity 安卓sdk 开发云

        本文链接:https://www.haomeiwen.com/subject/wunedrtx.html