哪个免费建站好,wordpress免费建站教程,潮州汕头,网站的超级链接怎么做前言 
Universal Media Player算是视频流播放功能常用的插件了#xff0c;用到现在已经不知道躺了多少坑了#xff0c;这个插件虽然是白嫖的#xff0c;不过被甲方和领导吐槽的就是播放视频流的速度特别慢#xff0c;可能需要几十秒来打开监控画面#xff0c;等待的时间较…前言 
Universal Media Player算是视频流播放功能常用的插件了用到现在已经不知道躺了多少坑了这个插件虽然是白嫖的不过被甲方和领导吐槽的就是播放视频流的速度特别慢可能需要几十秒来打开监控画面等待的时间较久。还有当输出WebGL的时候视频无法播放这个问题也一直没法解决。而我们常用的萤石云监控视频流在小程序端或者Web端打开却快速了很多这也就启发了在Unity3d中也使用这种嫁接的方式来实现。就是通过打开网页在网页中播放视频流的方式来解决该问题。实验结果就是能比Universal Media Player打开快2-3倍。本文是Unity3d 2020.3.28f1c1 Personal版本以萤石云的ezopen协议为例实现该功能。 
如果你的视频流协议是其它的如rtmp、rtsp等则需要将摄像头的协议转成能够在浏览器中播放的协议具体方式需要做网页的相关人员进行。这个是我在网上搜到的方法本人并未进行实操测试仅供参考 1、Nginx的RTMP模块配置方法通过Ffmpeg将RTSP转成RTMP协议然后Nginx中配置RTMP到HLS协议的映射最后按照指定的规则路径请求即可。 2、Ffmpeg将RTSP协议直接转成HLS协议写入到Nginx的指定目录下然后Nginx将该目录代理成HTTP访问的方式浏览器直接请求即可这种方法会生成很多ts文件需要做清理处理尝试过可行但是不建议使用。 效果 
Windows效果一  
Windows效果二 WebGL平台 如果设备有问题会直接提示在播放界面上 以上动态图没有展示成功的画面因为设备非个人持有所以播放成功的画面未进行直接展示。 
工作准备 
笔者所用的插件 
LitJson 用于生成/解析网络请求的json。 DOTweenPro 用于制作简单的窗口弹出、关闭动画 3D WebView for Windows and macOS (Web Browser) 用于打开网页使用说明https://blog.csdn.net/qq_33789001/article/details/126180804的插件看需求使用Embedded Browser也可以需要WebGL 平台的还需要2D WebView for WebGL (Web Browser IFrame)插件。 
参考文章 之前笔者写过关于萤石云监控相关的操作可以进行一些参考复用。 获取accessTokenhttps://blog.csdn.net/qq_33789001/article/details/117251545 获取视频流地址https://blog.csdn.net/qq_33789001/article/details/128223680 Unity WebGl发布问题 https://blog.csdn.net/qq_33789001/article/details/128900799 
功能实现 
获取accessToken 
管理员账号根据appKey和secret获取accessToken接口. 请求地https://open.ys7.com/api/lapp/token/get 请求方式POST ① AccessToken即访问令牌。接口调用必备的公共参数之一用于校验接口访问/调用是否有权限有效期为7天有效期内不需要重复申请可以重复使用 ② 有效期7天无法变更请在业务端使用AccessToken的场景中校验老Token的有效性和失效时重新获取Token的机制 ③ 新获取Token不会使老Token失效每个Token独立拥有7天生命周期 接口列表如下 
返回字段 字段名 类型 描述 accessToken String 获取的accessToken expireTime long 具体过期时间精确到毫秒 这里的实现代码如下 //令牌相关[Header(设置萤石云的appKey)]public string appKey  ;[Header(设置萤石云的appSecret)]public string appSecret  ;string GetATUrl  https://open.ys7.com/api/lapp/token/get;[HideInInspector]public string AT  ;DateTime AtEdTime; //令牌失效时间
//请求萤石云的令牌void GetAccessToken(){isGetATing  true;ListIMultipartFormSection formData  new ListIMultipartFormSection();formData.Add(new MultipartFormDataSection(appKey, appKey));formData.Add(new MultipartFormDataSection(appSecret, appSecret));Global.DoReqWebApiPost(GetATUrl, formData, (bytes) {try{if (string.IsNullOrEmpty(bytes)) return;JsonData datas  JsonMapper.ToObject(bytes);if (!datas.ContainsKey(data)) return;if (!datas[data].ContainsKey(accessToken) || !datas[data].ContainsKey(expireTime)) return;AT  datas[data][accessToken].ToString();AtEdTime  ConvertToDateTime(datas[data][expireTime].ToString());}catch (Exception e){Debug.LogWarning(获取萤石云AccessToken异常  e);}finally {isGetATing  false;}});
}要注意的是如果程序长期运行需要判断accessToken的过期时间即使获取并更新不然会导致功能异常。 
获取监控视频流 
获取单个的视频流地址需要使用accessToken为参数并且protocol的协议必须是ezopen同时过期时间需要尽量长一些。 [Header(是否同步流地址)]public bool isSyncUrl  true;[Header(选择视频流类型)]public Streaming_Type streamingType  Streaming_Type.ezopen;[Header(监控设备编号)]public string deviceSerial;[Header(监控频道号)]
public string channelNo;//获取视频地址void GetSteamingUrl(){ListIMultipartFormSection formData  new ListIMultipartFormSection();formData.Add(new MultipartFormDataSection(accessToken, YsAccessTokenMgr.instance.AT));formData.Add(new MultipartFormDataSection(deviceSerial, deviceSerial));formData.Add(new MultipartFormDataSection(channelNo, channelNo));formData.Add(new MultipartFormDataSection(expireTime, 2592000));formData.Add(new MultipartFormDataSection(protocol, ((int)streamingType).ToString()));formData.Add(new MultipartFormDataSection(quality, 1));Global.DoReqWebApiPost(StreamUrl, formData, (bytes) {try{if (string.IsNullOrEmpty(bytes))return;JsonData datas  JsonMapper.ToObject(bytes);if (!datas.ContainsKey(data)|| !datas[data].ContainsKey(url))return;videourl  datas[data][url].ToString();}catch (Exception e){Debug.LogWarning(获取萤石云视频流地址异常  e);}});}这里也可以不获取视频流地址只有视频嵌入式需要ezopen的地址isSyncUrl 为false时就不会获取。 
打开网页播放视频 
我们在点击了监控视频的标签后就根据视频标签的信息打开监控视频的网页。 这里有两种方式进行播放视频流视频嵌入式和跳转播放页式详细说明请看https://open.ys7.com/bbs/article/20 因为我们的视频窗口是在UI上所以使用CanvasWebViewPrefab进行网页打开 canvasWebView.WebView.LoadUrl(url);视频嵌入式 
代码如下 string url  https://open.ys7.com/ezopen/h5/iframe_se?url  path  autoplay1audio0accessToken  YsAccessTokenMgr.instance.AT;canvasWebView.WebView.LoadUrl(url);说明如下 url监控地址包含验证码、设备序列号、通道号、清晰度、播放类型 autoplay1-开启自动播放未显示字段-关闭自动播放 audio1-开启音频未显示字段-关闭音频 accessToken访问令牌播放监控地址的必要参数 笔者在测试该方式时发现在WebGL时这种方式在一定情况下会出现网页错误视频未播放的情况  
跳转播放页式 
代码如下 string url   https://open.ys7.com/ezopen/h5/live?autoplay1audio0accessToken  YsAccessTokenMgr.instance.AT  hd1deviceSerial  camlab.deviceSerial  channelNo  camlab.channelNo;canvasWebView.WebView.LoadUrl(url);说明如下 live后缀预览 rec后缀回放 autoplay1-开启自动播放未显示字段-关闭自动播放 audio1-开启音频未显示字段-关闭音频 accessToken访问令牌播放监控地址的必要参数 validCode验证码加密设备播放需要验证码 hd1-高清实际为主码流未显示字段-流畅实际为子码流 deviceSerial设备序列号 channelNo通道号 
工程源码 
完整的工程源码https://download.csdn.net/download/qq_33789001/88135255 无法打开说明审核未通过。 
现在工程后,打开项目中的Main.unity场景选中FunNodesYsAccessTokenMgr节点设置您自己的appKey和appSecret  
选中Icon_Camera修改视频标签的信息deviceSerial和channelNo  
确保的信息都是同一个账号下面的运行后点击视频图标即可看到播放的效果了。