CicadaPlayer实现多屏同步播放介绍

简介: # 1. 多屏同步的使用场景 此功能来自于一个需求:在同一个屏幕上同步显示同一个内容的四个不同码率的画面,用来展示不同的分辨率和码率最终被播放出来的画质的差异。 抽象一下此需求的场景,其实就是要多个播放器之间进行同步的需求,这些播放器之间可以不一定是同一个app内,甚至可以是互联网上的任何两个播放器实例。 ## 使用场景一 一个App中多个播放器间同步,如同最原始的需求。 ## 使用场景

1. 多屏同步的使用场景

此功能来自于一个需求:在同一个屏幕上同步显示同一个内容的四个不同码率的画面,用来展示不同的分辨率和码率最终被播放出来的画质的差异。
抽象一下此需求的场景,其实就是要多个播放器之间进行同步的需求,这些播放器之间可以不一定是同一个app内,甚至可以是互联网上的任何两个播放器实例。

使用场景一

一个App中多个播放器间同步,如同最原始的需求。

使用场景二

一个博物馆要投射一个模拟清明上河图的场景再现视频,由于清明上河的宽度非常宽,如果用普通的方案去投射,那么视频将无法观看,博物馆采用的方案是使用多个投影仪排成一排,每个投影仪投射整个视频的一部分,多个投影仪同步播放,这样就可以更好的把清明上河图的场景再现视频更好的播放了。

此场景可以使用一台比较强大的主机,同时播放各个部分的画面,然后通过hdmi阵列输出,如果这样实现,则和场景一差不多,只是内容不是相同的而已。如果这么实现,那么对主机的要求就比较高了,需要一个强大的解码功能,和多hdmi输出的显卡,并需要考虑画面和hdmi的输出对应关系。

此场景也可以使用局域网来连接多个播放设备进行同步,这样的成本就会低很多,设备的摆放和线路的连接也要容易得多。

使用场景三

互联网上有个虚拟的房间,房间里面的人会观看同一个内容的视频,但是希望房间里面的所有观看者观看的视频的进度是一致的,这样可以更好的进行一些互动。如答题,猜球之类。

此场景需要互联网上的两个播放器进行同步。

2实现

从上面能想到的场景来看,只要播放器之间可以通过网络进行通信,上述的所有需求都可以满足,所以CicadaPlayer多屏同步采用的是tcp网络协议进行同步。

可以参考https://github.com/alibaba/CicadaPlayer/blob/develop/cmdline/example/syncPlayer.cpp
中的实现。

其中实现了一个用tcp client server的方式实现了一个master播放器和多个slave播放器之间进行同步的例子

static string serverIp = "tcp://localhost:8888";
server的地址,如果在同一台机器上跑,则host就是localhost或者127.0.0.1,如果跑在不同的机器上,请填入正确的ip地址。

此例子中同时实现了master和slave player,通过bMaster变量进行控制,
如果想启动server,则

./syncPlayer  file

如果想启动slave

./syncPlayer  file  1

由于播放的内容可能是网络内容,也有可能是直播,所以要想让两个视频能内容同步,则必须让两个播放器同时prepare,同时start才行,所以在syncPlayer中prepare是用户来控制的,并且不能autostart。

此示例是所有的slave只向master同步,未考虑双向通信,双向通信在后面如果有需求再去实现。

如果是master

创建一个messageServer并初始化,播放器的设置按照正常的逻辑走,在

syncPlayerEventListener::onPrePare中prepare自己,并同时向server中发送prepare消息,让所有的slave开始prepare。

onStatusChanged onLoadingStart onLoadingEnd中根据状态向server中发送start或者pause消息。

在一个循环中定时GetMasterClockPts获取当前播放器的clock发送给sever。

如果是slave

创建一个messageClient,并连接server,用来接收来自server的消息。

播放器设置成只播放视频(音视频都播放的case暂时还不支持),在一个循环中收到消息后进行处理,pause prepare start 暂不多说,slave中自己启动一个时钟来记录从server中发送过来的clock的值,由于server不可能特别频繁的发送clock值,所有slave中的clock本身就具有计时功能,在server的clock发送过来的时候只是进行校正而已。

slave播放器将自己的clock当成播放器的参考时钟,通过SetClockRefer api设置给播放器,这样slave播放器内部在播放视频的时候就会获取这个参考时钟,从而实现和master同步播放的功能。

未完成的工作

  1. 目前slave只支持纯视频播放,如果要音视频都要播放,要考虑slave播放过快或者过慢的时候要进行音频的等待或者丢帧(倍速也可以)。
  2. 目前只支持了单向通信,目前还不完善,只能比较好的实现通一个App内的同步,多进程间要考虑在每个slave都prepare完成后才能start。
  3. 目前无整体进度同步的逻辑,若在场景三种使用,则master应该不是一个实体播放器,应该是一个放到公网上的虚拟播放器,虚拟播放器通过所有的client端反馈上来的状态来决定什么时候要开始播放,怎么确定主时钟的值等,来让绝大部分播放器同步。
相关文章
|
监控
在进行多路直播时,如何保证不同视频源之间的同步性?
【10月更文挑战第7天】在进行多路直播时,如何保证不同视频源之间的同步性?
439 1
visual studio 2022 社区版 c# 环境搭建及安装使用【图文解析-小白版】
这篇文章提供了Visual Studio 2022社区版C#环境的搭建和安装使用指南,包括下载、安装步骤和创建C#窗体应用程序的详细图文解析。
visual studio 2022 社区版 c# 环境搭建及安装使用【图文解析-小白版】
|
10月前
|
缓存 自然语言处理 安全
快速调用 Deepseek API!【超详细教程】
Deepseek 强大的功能,在本教程中,将指导您如何获取 DeepSeek API 密钥,并演示如何使用该密钥调用 DeepSeek API 以进行调试。
|
存储 监控 BI
如何设置AD域用户仅登录到指定的计算机?AD域管理软件
本文介绍了如何使用AD域服务限制用户仅能登录特定计算机,包括通过属性设置和脚本实现。此外,提到了ADManagerPlus这款工具,它能够批量管理AD域用户,包括创建、修改用户信息,分配权限,并通过报表监控用户状态,有效提升AD域管理效率。
555 0
|
并行计算 前端开发 物联网
全网首发!真·从0到1!万字长文带你入门Qwen2.5-Coder——介绍、体验、本地部署及简单微调
2024年11月12日,阿里云通义大模型团队正式开源通义千问代码模型全系列,包括6款Qwen2.5-Coder模型,每个规模包含Base和Instruct两个版本。其中32B尺寸的旗舰代码模型在多项基准评测中取得开源最佳成绩,成为全球最强开源代码模型,多项关键能力超越GPT-4o。Qwen2.5-Coder具备强大、多样和实用等优点,通过持续训练,结合源代码、文本代码混合数据及合成数据,显著提升了代码生成、推理和修复等核心任务的性能。此外,该模型还支持多种编程语言,并在人类偏好对齐方面表现出色。本文为周周的奇妙编程原创,阿里云社区首发,未经同意不得转载。
29778 18
|
JavaScript
cnpm 的安装与使用
本文介绍了npm和cnpm的概念、安装nodejs的步骤,以及cnpm的安装和使用方法,提供了通过配置npm使用中国镜像源来加速包下载的替代方案,并说明了如何恢复npm默认仓库地址。
cnpm 的安装与使用
【Qt 学习笔记】Qt窗口 | 浮动窗口 | QDockWidget的使用及说明
【Qt 学习笔记】Qt窗口 | 浮动窗口 | QDockWidget的使用及说明
1680 3
|
API C# 开发框架
WPF与Web服务集成大揭秘:手把手教你调用RESTful API,客户端与服务器端优劣对比全解析!
【8月更文挑战第31天】在现代软件开发中,WPF 和 Web 服务各具特色。WPF 以其出色的界面展示能力受到欢迎,而 Web 服务则凭借跨平台和易维护性在互联网应用中占有一席之地。本文探讨了 WPF 如何通过 HttpClient 类调用 RESTful API,并展示了基于 ASP.NET Core 的 Web 服务如何实现同样的功能。通过对比分析,揭示了两者各自的优缺点:WPF 客户端直接处理数据,减轻服务器负担,但需处理网络异常;Web 服务则能利用服务器端功能如缓存和权限验证,但可能增加服务器负载。希望本文能帮助开发者根据具体需求选择合适的技术方案。
934 1
|
算法 Python
`scipy.optimize`模块提供了许多用于优化问题的函数和算法。这些算法可以用于找到函数的最小值、最大值、零点等。
`scipy.optimize`模块提供了许多用于优化问题的函数和算法。这些算法可以用于找到函数的最小值、最大值、零点等。
|
编解码 应用服务中间件 开发工具
如何拉取公网RTSP/RTMP流在内网多客户端播放
好多情况下,一路RTSP或RTMP网络流过来后,想共享给更多局域网内的客户端播放,一般来说,有两种设计方案: 1. 拉取的RTSP或RTMP流,回调后的数据,转推RTMP服务器,内网部署一台RTMP服务器(如NGINX或者SRS)即可; 2. 拉取后的RTSP或RTMP流,回调后的数据,汇聚到内置RTSP服务模块,内网其他终端,只要拉RTSP流即可,无需再二次部署流媒体服务器。
1008 0