【Unity】通过UDP实现VideoPlayer视频同步播放

Unity3D 实现视频播放和声音同步(笔记) 这个代码有些杂乱 ,是工作中的一个文件,我特意拿出来保存在这里,希望自己和别人可以以后直接借鉴。 当然如果想要使用本文件 , 还要经过一些修改,因为这个文件单独拿出来是不能独立运行的,不过经过简单的修改就可以实现上述功能了,比如把按钮控制播放停止等等太加进来就基本可以使用。 using UnityEngine; using System.Collections; public class 阅读详情

对于传输方面,本人也是菜鸟一枚,因需求而临时写以下功能代码:

 

注意:UDP传输的内容,仅提供了传输的数据。 实际应用的情况下,必须确定传输内容的校验。

代码贴出来是进行修改过的,如果需要用到该代码。

1.需要同步多个视频的功能,请更改视频播放部分(videoPlayer的视频切换以及视频的索引值)。

2.仅同步一个视频,请把视频索引部分的代码去掉,便可同步视频的播放进度。

3.仅适合网络环境较好的情况,并且会因为各种因素,造成播放出现1秒以内的不同步

 

服务端(负责发送当前视频播放进度)代码如下:

using System.Collections;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using UnityEngine;
using UnityEngine.Video;

public class ServerByUDP : MonoBehaviour
{
    public string ip = "127.0.0.1";                 //发送到目标Ip
    public int port = 8001;
    private UdpClient client;
    public float time = 0;

    //          请根据自行编写的播放脚本            //
    public VideoPlayer videoPlayer;                 //播放视频组件
    public int index = 0;                           //播放视频的索引
    //          ------------------------            //
    
    // Start is called before the first frame update
    void Start()
    {
        client = new UdpClient();

    }

    // Update is called once per frame
    void FixedUpdate()
    {
        SendMessagesToClient();
    }


    private void SendMessagesToClient()
    {
        if (time > 0.1f)
        {
            byte temp1 = 255;                                           //标识符
            byte videoIndex = (byte)index;                              //读取当前视频索引值
            ushort byFrame = (ushort)videoPlayer.frame;                 //读取当前视频播放到的帧数
            byte[] frame = new byte[2];
            frame[0] = (byte)byFrame;
            frame[1] = (byte)(byFrame >> 8);
            byte[] bytes = new byte[4] { temp1 , videoIndex, frame[1], frame[0] };
            client.Send(bytes, bytes.Length, new IPEndPoint(IPAddress.Parse(ip), port));
            time = 0;
        }
        time += Time.deltaTime;
    }
    void UDPClose()
    {
        if (client != null)
            client.Close();

    }
    void OnApplicationQuit()
    {
        UDPClose();
    }

}

 

客户端(负责接收同步信息):

using System.Collections;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using UnityEngine;
using UnityEngine.Video;

public class ClientByUDP : MonoBehaviour
{
    public string ip = "127.0.0.1";
    public int port = 8001;

    private UdpClient server;
    Thread connectThread;
    IPEndPoint point;

    public bool isServerActive = false;

    private VideoPlayer videoPlayer;
    private int lastIndex;
    private int lastFrame;
    private int newIndex;       
    private int newFrame;
    // Start is called before the first frame update
    void Start()
    {
        connectThread = new Thread(UDPReceive);
        connectThread.Name = "Connect Thread";
        server = new UdpClient(new IPEndPoint(IPAddress.Parse(ip), port));
        point = new IPEndPoint(IPAddress.Any, 0);
        connectThread.Start();
    }


    //视频播放理应和UDP接收端分开编写,为了给读者阅读,这里放在这里了
    //注意Unity中的组件,无法在线程中使用!
    private void Update()
    {
        if(lastIndex!=newIndex && lastFrame != newFrame)
        {
            lastIndex = newIndex;
            //切换视频的逻辑{   }
            //videoPlayer.url  = 
            videoPlayer.frame = newFrame;
            videoPlayer.Play();
        }
    }

    byte[] receiveData;
    public void UDPReceive()
    {
        while (isServerActive)
        {
            receiveData = new byte[4];
            try
            {
                receiveData = server.Receive(ref point);
                ushort frame = (ushort)((receiveData[2] << (1 * 8)) + (receiveData[3] << (0 * 8)));
                newFrame = frame;
            }
            catch
            {

            }
        }
    }

    public void UDPClose()
    {
        if (server != null)
            server.Close();
    }
    private void OnApplicationQuit()
    {
        UDPClose();
    }

}

 

Unity 多机器的视频不卡帧同步 视频同步不同于图片帧同步,因为图片帧同步只要传递帧数,然后加载相应的图片就行。 一、使用VideoPlayer做视频时间同步 最开始想到的方法就是这样,因为时间是视频位置的控制。使用UDP测试之后发现,在给VideoPlayer设置播放时间的时候,会有卡顿的现象。估计是要解析这个时间的视频数据,所以就觉得可能是VideoPlayer解析能力不能,其实本来也不行。于是就用了EasyMovieTe... 阅读详情

相关推荐

Unity WebGL集成RTSP视频流:服务端转码与HLS播放方案详解

在Web应用开发中,实时视频流的集成是一个常见需求,尤其是在三维可视化、数字孪生和安防监控等领域。其核心原理在于将摄像头等设备产生的原始视频流,通过特定的网络协议传输并在客户端进行解码渲染。然而,浏览器环境存在原生协议支持限制与网络沙箱约束,这为直接播放RTSP等流媒体协议带来了技术挑战。从技术价值看,解决此问题能打通物联网设备与Web三维应用的实时数据通道,极大扩展了Web应用的交互与展示能力。常见的应用场景包括智慧工厂监控、智慧园区管理和交互式产品展示平台。本文聚焦于通过服务端转码代理这一稳健方案,利用

afeyfre41671的博客 423

Unity局域网多设备同步播放视频源码

untiy实现在同一局域网内指定多台设备同步播放视频,不限制视频名称,不限制运行先后顺序,操作简单易懂,可同时实现多组同步,亲测可用。

Unity接入海康威视摄像头:SDK与VideoPlayer方案深度对比与低延迟实战

在实时音视频应用开发中,低延迟是衡量系统性能的核心指标之一,它直接决定了用户体验的流畅性与交互的实时性。其技术原理涉及从视频采集、编码、网络传输到客户端解码、渲染的完整链路优化,任何环节的缓冲或处理不当都会引入延迟。对于Unity开发者而言,在引擎中实现低延迟视频流接入具有重要的技术价值,尤其在安防监控、AR/VR融合、工业质检等对实时性要求苛刻的应用场景中。本文聚焦于Unity集成海康威视摄像头的两种主流方案:通过官方SDK进行底层硬解码与渲染,以及使用Unity VideoPlayer组件进行RTSP流

weixin_33946605的博客 1032

unity 之同一局域网内视频帧同步

unity 用UDP做视频同步

m0_64970404的博客 5729

Unity视频播放新方案:VLC插件实现全格式支持与硬件解码

在Unity应用开发中,视频播放功能是常见的多媒体需求,其核心原理涉及解码器、渲染管线与平台兼容性。传统方案如Unity原生VideoPlayer组件,受限于系统解码器支持,在格式兼容性、性能优化和高级功能上存在明显瓶颈。为解决这一问题,开发者可引入第三方媒体引擎,通过原生插件集成方式,实现更强大的解码能力与硬件加速。VLC for Unity插件正是基于这一技术思路,将开源的LibVLC引擎深度集成到Unity环境中,为开发者提供了全格式解码、网络流媒体支持与跨平台硬件解码等关键技术价值。该方案特别适用于

weixin_30352191的博客 413

Unity超高清Hap视频播放与帧同步实战:从原理到多屏精准控制

在实时图形与交互应用开发中,视频播放是常见的需求,其核心挑战在于解码性能、内存效率与精准控制。传统CPU软解码方案在处理4K以上超高清视频时,往往面临性能瓶颈与延迟问题。GPU硬件解码技术通过将解码任务卸载到显卡,显著提升了处理效率并降低了CPU负载。Hap编码格式正是为此而生,它采用基于纹理的压缩和帧独立设计,使视频数据能直接在GPU中处理,极大优化了实时播放性能。这一技术对于数字孪生、虚拟演播、大型沉浸式展览等对流畅度与同步精度要求极高的工程实践场景价值巨大。本文聚焦的Demolition Media

weixin_30736301的博客 411

Unity+C# 初入——UDP发送

文章目录Unity+C# 初入——UDP发送 Unity+C# 初入——UDP发送 原博客链接 1 using System.Collections.Generic; 2 using System.Net; 3 using System.Net.Sockets; 4 using System.Text; 5 using System.Threading; 6 using UnityEngine; 7 using System; 8 9 public class

scy261983626的博客 584

Unity WebGL零插件播放RTSP视频流:服务端转HLS全方案

实时流协议(RTSP)是安防监控和流媒体领域的核心协议,它通过建立会话控制来传输音视频数据。然而,在Web环境中,由于浏览器的安全沙箱限制,无法直接处理RTSP这类需要原生网络库支持的复杂协议。为解决这一矛盾,通常需要借助流媒体服务器进行协议转换,将RTSP流转码为浏览器原生支持的HTTP动态流格式,如HLS(HTTP Live Streaming)。这种技术方案在工程实践中价值显著,它平衡了实时性、兼容性与开发成本,使得复杂的实时视频流能在Web平台无缝播放。具体到Unity WebGL平台,通过结合FF

weixin_28197941的博客 277

Unity VideoPlayer做的播放器,重复播放一定次数后,一定几率导致视频画面卡死 (导出的exe)

如题的问题经过反复测试之后,起初将问题锁定在的的的的的VideoPlayer的效率问题以及UDP的多线程问题上。 但是经过反复比对排除了UDP多线程出现错误导致卡死的可能。 后续测试中,发现播放中的程序的CPU占用非常高,每个EXE占用CPU会达到23%以上,当程序多开或者单个程序运行,一定几率会使某一个的EXE播放画面停止,但是程序还在运行,测试输出的数字还在不断变化,当点击退出程序时,程序无响...

qq_35531227的博客 4420

别再只用VideoPlayer了!Unity Windows平台视频播放插件深度横评:AVPro vs UMP vs 免费方案

本文深度评测了Unity Windows平台三大视频播放插件(AVPro Video、UMP及免费方案),重点分析协议兼容性、性能表现等核心指标,为工业级应用如数字孪生提供选型建议。特别针对RTSP/RTMP流媒体场景,对比硬件解码、多屏同步等关键能力,帮助开发者优化视频播放体验。

weixin_30378623的博客 544

Unity接入海康威视视频流:从RTSP到数字孪生的完整技术路线

在数字孪生与工业可视化项目中,实时视频流的接入与渲染是构建沉浸式三维场景的关键环节。RTSP作为摄像头取流的通用协议,承担着设备端与渲染引擎之间的数据传输任务,而Unity引擎本身并不原生支持RTSP播放,这需要在传输协议与渲染管线之间建立桥梁。针对不同应用场景,可以选择转流至HLS配合VideoPlayer、直接调用海康威视SDK解码后生成纹理贴图,或通过WebGL页面方案绕开引擎限制。这些技术路径在延迟、多路并发、跨平台兼容性上各有取舍,工程实践中需结合监控大屏、三维模型贴图叠加、业务联动等具体需求进行

weixin_34280237的博客 436

Unity局域网多屏视频同步播放:基于NTP与心跳校准的实战方案

多设备协同播放视频是数字展厅、演出大屏等场景的常见需求。由于各设备本地时钟独立运行,直接同时调用播放会产生难以忽视的画面错位。NTP(网络时间协议)通过时间戳交换可测量设备间的时钟偏移,UDP组播则能构建轻量的控制通道。本文介绍一套基于Unity引擎的实战方案,利用简化版NTP统一全局时间基准,再结合心跳包持续校准VideoPlayer的播放进度与速度,最终将多屏画面误差稳定在150ms以内。该方案适用于局域网稳定环境下的多屏联动、沉浸空间等场景,兼顾了工程可落地性与调优空间。

weixin_33976326的博客 95

Unity RTSP流低延迟播放优化实战:从原理到跨平台实现

实时流媒体协议(RTSP)是音视频传输领域的基础协议,广泛应用于监控、直播、远程协作等场景。其工作原理是通过RTP/UDP或TCP传输媒体数据,由客户端解码后渲染显示。在游戏引擎中实现低延迟RTSP播放的核心技术价值在于打通网络接收、硬件解码与GPU渲染之间的高效通路,从而满足AR/VR、无人机图传等对实时性要求极高的交互式应用需求。本文聚焦于在Unity引擎内构建一套从网络层、解码层到渲染层的系统性优化架构,通过平台原生硬件解码器(如MediaCodec、VideoToolbox)与GPU零拷贝纹理上传技

weixin_33674976的博客 736

Unity VideoPlayer做的播放器,重复播放一定次数后,一定几率导致视频画面卡死 (导出的exe)

如题的问题经过反复测试之后,起初将问题锁定在的VideoPlayer的效率问题以及UDP的多线程问题上。 但是经过反复比对排除了UDP多线程出现错误导致卡死的可能。 后续测试中,发现播放中的程序的cpu占用非常高,每个EXE占用杯会达到23%以上,当程序多开或者单个程序运行时间过长,一定几率会使某一个的exe播放画面停止,但是程序还在运行,测试输出的数字还在不...

m0_38143858的博客 2万+

Unity中RTSP流媒体播放实战:VLCPlayerforUnity插件深度应用与优化

在Unity应用开发中,视频播放是常见的功能需求,尤其涉及实时流媒体协议时,对稳定性和兼容性要求更高。RTSP(实时流协议)作为安防监控、无人机图传等领域的核心协议,其实现原理基于客户端-服务器的信令交互与媒体传输。传统Unity VideoPlayer组件因依赖平台原生解码器,对RTSP等网络流支持有限,常出现黑屏、卡顿或兼容性问题。为解决这一技术痛点,开发者可借助成熟的媒体处理引擎,如VLC的libvlc库,它提供了广泛的编解码支持和稳健的网络流处理能力。通过封装集成,VLCPlayerforUnity

weixin_29003437的博客 283

Unity局域网多设备视频同步播放:时钟同步与UDP协议实战

在多屏互动、展厅大屏或混合现实场景中,让多台设备同步播放视频是一项常见却充满挑战的需求。其核心难点并非视频解码本身,而在于如何让每台设备的播放进度在同一个时间轴上对齐。由于设备系统时钟存在漂移,直接比较本地时间毫无意义;而网络延迟抖动又会破坏逐帧指令的同步性。业界通常采用“主从+时间轴”模型,通过UDP广播下发命令与校准信息,结合双向时间戳计算时钟偏移,让各设备独立解码播放。本文从基础概念出发,讲解时间轴同步替代帧同步的原理,剖析UDP命令包设计、时钟校准流程,并给出Unity VideoPlayer与So

weixin_31896061的博客 198

Unity WebGL RTSP视频流播放:FFmpeg+WebSocket实战方案深度解析

实时流媒体协议(RTSP)是安防监控、直播等领域的核心传输协议,它通过建立会话控制来实现音视频数据的实时传输。其工作原理基于客户端与服务器间的信令交互,支持播放、暂停等控制操作。在Web环境中,由于浏览器缺乏原生RTSP支持,通常需要借助转码技术将RTSP流转为Web友好的格式(如HTTP-FLV、HLS或WebRTC)。这一技术价值在于打通了传统监控设备与现代化Web应用的连接,极大地扩展了视频监控、数字孪生、远程巡检等可视化应用场景的部署灵活性。本文聚焦于Unity WebGL这一特定环境,针对其网络访

weixin_30907935的博客 359

Unity局域网多设备视频同步播放方案:基于UDP与时间轴校准

在多屏联动、VR大空间等局域网场景中,多台设备播放同一视频并要求画面严格对齐,但依靠客户端同时点击播放无法保证一致性,其根本原因在于设备时钟不同步、解码延迟差异以及播放漂移。解决这类分布式同步问题的核心是时间同步技术,它通过NTP类算法统一各设备的时间轴,配合UDP协议传控指令,利用其低延迟和状态新特性确保指令时效性。时间同步的价值在于为音视频播放、数据采集等实时交互场景提供统一基准,广泛应用于展厅播控、远程协作等领域。在此基础上,结合Unity VideoPlayer的time属性进行基于服务器时间轴的预

weixin_29628635的博客 270
上一篇: 【Unity】VideoPlayer根据视频命名规则读取并播放视频
下一篇: 【UnrealEngine】创建C++项目过程显示创建失败
Terrell21
博客等级 码龄9年 39粉丝 33原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值