视频同步不同于图片帧同步,因为图片帧同步只要传递帧数,然后加载相应的图片就行。

一、使用VideoPlayer做视频时间同步

最开始想到的方法就是这样,因为时间是视频位置的控制。使用UDP测试之后发现,在给VideoPlayer设置播放时间的时候,会有卡顿的现象。估计是要解析这个时间的视频数据,所以就觉得可能是VideoPlayer解析能力不行,其实本来也不行。于是就用了EasyMovieTexture插件。

修改程序之后,发现还是有一样的问题,于是就还是想换到视频的帧同步。但是EasyMovieTexture这个插件是以时间获取的视频图像,解析的帧和时间有关系的,所以时间的误差会导致帧图片不一样。因此又换回VideoPlayer做视频帧同步。

二、使用VideoPlayer做视频帧同步

VideoPlayer可以监听帧准备完毕的事件的

首先说一下整体思路,同步如果要不卡顿,首先肯定要帧缓存的。作为服务器的一方发出帧数的信息,接收的一方从保存的帧缓存中找到图像。

这里有几个问题:1、保存的图像是要占内存的,可能几百兆的视频,图片帧能到几个G,内存会炸,Unity会蹦。因此肯定缓存服务器当前帧之后的几个帧数。

2.图片保存在一个List中,图片和帧数应该组成一个数据包。在这帧数据使用之后,需要Destory掉图片,不然资源不会自己释放的。

3.VideoPlayer在播放的时候,帧准备好会frameReady。但是会有概率掉帧的,就是你没有缓存到某一帧,然而服务器请求到了那一帧,最好的办法就是跳过,直接丢掉这一帧。因为如果再去缓存这一帧,需要时间,当你找到,下一帧也到了。掉帧的原因可他获取帧的方法有关应该,播放速度越快,掉帧越明显。

4.VideoPlayer播放速度,肯定比服务器发送指令的速度要快一下,不然就会卡顿的,就相当于你解析速度没有播放速度快。因为当VideoPlayer帧缓存到一定数量的时候,停止播放。在你有数据空间的时候再开启。还要检测List最前的数据,是不是过期了,过期需要删除,腾出空间。

  video.frameReady += FrameReady;video.sendFrameReadyEvents = true;
private void FrameReady(VideoPlayer source, long frameIdx){RenderTexture buffertexture = source.texture as RenderTexture;RenderTexture.active = buffertexture;Texture2D texture = new Texture2D(buffertexture.width, buffertexture.height, TextureFormat.RGB24, false);texture.ReadPixels(new Rect(0, 0, buffertexture.width, buffertexture.height), 0, 0);texture.Apply();if (frameIdx == nowIndex){bgImage.texture = texture;return;}if (FrameContain((int)frameIdx))return;if ((frameIdx - nowIndex < 99 && frameIdx > nowIndex) || (int)video.frameCount + frameIdx - nowIndex < 99){if(allmovieTexture.Count > 1 && IsOldData()){Texture unuseTexture = allmovieTexture[0]._texture;GameObject.DestroyImmediate(unuseTexture);allmovieTexture.RemoveAt(0);}allmovieTexture.Add(new FrameDate() { index = (int)frameIdx, _texture = texture });}else if(allmovieTexture.Count < 50){video.frame = nowIndex + 5;}else{source.Stop();video.frame = frameIdx - 15;}}
 if (FrameContain(nowIndex)){int bufferindex = GetFrame(nowIndex);bgImage.texture = allmovieTexture[bufferindex]._texture;}if(!video.isPlaying){if ((allmovieTexture.Count > 1 && IsOldData())){Texture unuseTexture = allmovieTexture[0]._texture;GameObject.DestroyImmediate(unuseTexture);allmovieTexture.RemoveAt(0);video.Play(); }if (allmovieTexture.Count < 50){video.Play(); }}
 private bool FrameContain(int index){for (int i = 0; i < allmovieTexture.Count; i++){if (allmovieTexture[i] != null && allmovieTexture[i].index == index){return true;}}return false;}private int GetFrame(int index){for (int i = 0; i < allmovieTexture.Count; i++){if (allmovieTexture[i] != null && allmovieTexture[i].index == index){return i;}}return -1;}private bool IsOldData(){int frameIdx = allmovieTexture[0].index;if (!((frameIdx - nowIndex < 99 && frameIdx > nowIndex) || (int)video.frameCount + frameIdx - nowIndex < 99)){return true;}return false;}

代码比较乱,因为工程有其他部分,也不好截取。最好自己按照思路写吧。

我再局域网用UDP测试过,服务器用videoPlayer正常播放,客户端用帧同步。

不论是服务器先启动还是客户端先启动,都能在2秒以内同步上。客户端播放开始因为没帧缓存,会有一些图像跳动的现象,但几秒后就好了。

如果有其他好的方法也希望能留言告诉我一下,谢谢!

Unity 多机器的视频不卡帧同步相关推荐

  1. Unity基础知识学习七,帧同步源码学习

    前言 在学习帧同步框架源码之前,先过一遍基础知识:Unity基础学习六,网络同步_u013617851的博客-CSDN博客 视频地址:帧同步教程[合集]_哔哩哔哩_bilibili github地址: ...

  2. 关于Unity VideoPlayer组件 视频切换第一帧卡顿

    关于Unity VideoPlay组件 视频切换第一帧卡顿的问题 1.问题: 在做项目时,发现VideoPlayer组件在多个视频切换时,会在第一帧重复上个视频的结束时的画面. 2.原因: 因为Vid ...

  3. unity webgl打包 苹果12以上机型打开连接后模型黑屏卡帧问题

    unity webgl打包 苹果12以上打开模型卡帧问题 查找到问题大概是跟场景灯光阴影相关, 如果关闭阴影 在苹果12以上的机型上打开就会出现卡帧问题 解决方案: 灯光这样设置就可以解决卡帧问题

  4. 复盘王者荣耀手游开发全过程,Unity引擎使用帧同步放弃状态同步

    http://king.shandian.biz/88.html 如今已经大获市场成功的<王者荣耀>一直是业内各方关注的对象,而我们也知道这款产品在成为国民级游戏之前,也遇到过一段鲜有人知 ...

  5. 王者荣耀为什么选择帧同步和Unity引擎

    Unity的选择优势: 1.易上手,我们花三周就可以做出Demo,可以看到易上手是它的一个非常大的优势. 2.它的工具都是很完善的,能够做到一站式解决,你不需要在这里面下载工具,那里面额外补充一些插件 ...

  6. Unity游戏帧同步技术分享篇【01】帧同步解决方案概述

    前言: 1.0 帧同步原理与简介 A.什么是帧同步? 帧同步是一种前后端数据同步的方式,一般应用于对实时性要求很高的网络游戏. 其基本实现流程及思路可以概括为: 1.所有客户端每帧上传操作指令集到服务 ...

  7. 【Unity】制作手游的帧同步时遇到的问题

    网络游戏的同步可以做的很简单,也可以做的很复杂.简单来说就是通过Http或者Socket来跟服务器同步数据.而如果往复杂了说,可以有p2p.帧同步.航位预测等等高级课题可以研究. 因为我们的项目需求- ...

  8. unity 实现帧同步

    阅前提示: 此框架为有帧同步需求的游戏做一个简单的示例,实现了一个精简的框架,本文着重讲解帧同步游戏开发过程中需要注意的各种要点,伴随框架自带了一个小的塔防sample作为演示. 文章目录 阅前提示: ...

  9. Unity游戏开发 帧同步战斗框架 框架篇

    本篇主要是提供帧同步主体框架的实现方法以及源码.还有一些坑点的分析.如果对帧同步理论感兴趣的话可以看看这里<帧同步理论篇>. ps:我的同步框架是在lua里面写的,已经经过了测试没有什么问 ...

最新文章

  1. Atitit.提升 升级类库框架后的api代码兼容性设计指南
  2. 微服务前端开发框架React-Admin
  3. Linux-diff和diff3命令
  4. 【网址收藏】spark on k8s operator github地址
  5. java数组为什么可以迭代吗_在迭代2D数组时,为什么循环的顺序会影响性能?
  6. mysql索引优化笔试题_索引优化策略面试题
  7. HDU 1021 Fibonacci Again
  8. leetcode 718 最长公共子串
  9. Android 5.1.1 源码目录结构
  10. 第三届光明区创新创业大赛——聚各方力量,助光明璀璨
  11. 实验记录 | 6/29
  12. bootrom的构成
  13. vmware 桥接 无线网卡 问题解决方案
  14. 基于Java+Swing+Mysql项目信息管理系统
  15. jav皮卡_前5名:12个模因,皮卡第,AMP打开还是关闭? 和更多
  16. 多项式polynomial 考试 解题报告
  17. Twitter 账号爬取
  18. AOP切面获取参数的一个小技巧
  19. centos7 安装Calibre搭建一个家用图书馆
  20. ubuntu进去安全模式_win10和Ubuntu双系统,无法开机如何进入win10安全模式

热门文章

  1. DataGrip数据库管理工具安装使用
  2. DataGrip如何将创建的console保存路径设置到指定目录?
  3. 阻塞、非阻塞,同步、异步
  4. 产品经理入门02:项目规划及产品设计
  5. 珠海云服务器散热器定做,我家云之瞎乱改造(散热+扩存)篇一
  6. linux系统玩ps3模拟器下载地址,【RPCS3模拟器】RPCS3模拟器下载(PS3模拟器) 电脑版-开心电玩...
  7. DPlayer – H5视频播放器使用方法介绍
  8. anaconda初体验
  9. 【图像配准】SIFT图像配准【含Matlab源码 1007期】
  10. @Validated使用