专利类型 | 发明公开 | 法律事件 | 公开; 实质审查; |
专利有效性 | 实质审查 | 当前状态 | 实质审查 |
申请号 | CN202411347117.7 | 申请日 | 2024-09-26 |
公开(公告)号 | CN119342264A | 公开(公告)日 | 2025-01-21 |
申请人 | 浪潮云信息技术股份公司; | 申请人类型 | 企业 |
发明人 | 程行通; 谢涛涛; 安晓博; 尹萍; | 第一发明人 | 程行通 |
权利人 | 浪潮云信息技术股份公司 | 权利人类型 | 企业 |
当前权利人 | 浪潮云信息技术股份公司 | 当前权利人类型 | 企业 |
省份 | 当前专利权人所在省份:山东省 | 城市 | 当前专利权人所在城市:山东省济南市 |
具体地址 | 当前专利权人所在详细地址:山东省济南市高新区浪潮路1036号浪潮科技园S01号楼 | 邮编 | 当前专利权人邮编:250100 |
主IPC国际分类 | H04N21/43 | 所有IPC国际分类 | H04N21/43 ; H04N21/431 |
专利引用数量 | 0 | 专利被引用数量 | 0 |
专利权利要求数量 | 10 | 专利文献类型 | A |
专利代理机构 | 济南信达专利事务所有限公司 | 专利代理人 | 姜丽洁; |
摘要 | 本 发明 涉及前端客户端开发技术领域,具体提供了一种视频画面多屏显示方法及装置,具有如下步骤:S1、全局初始化阶段;调用DirectDrawEnumerateEx 接口 遍历系统显示设备,保存每个显示设备的显示设备句柄hMonitor和显示设备GUID gMonitorGUID到显示设备数组;S2、在新建一路视频显示时进行通道初始化阶段;S3、循环遍历每个显示设备,并显示画面在本显示设备上的部分;S4、在关闭一路视频显示时进行通道释放阶段;S5、在退出APP时进行全局释放阶段,释放各显示设备关联的非空全局资源。与 现有技术 相比,本发明能够在单屏多路高清播放、单屏大路数普通画质播放、多屏多路数高清播放、多屏拼接播放等多种场景下,都能实现视频的流畅播放。 | ||
权利要求 | 1.一种视频画面多屏显示方法,其特征在于,具有如下步骤: |
||
说明书全文 | 一种视频画面多屏显示方法及装置技术领域[0001] 本发明涉及前端客户开发技术领域,具体提供一种视频画面多屏显示方法及装置。 背景技术[0002] 随着互联网信息技术发展,越来越多的个人电脑配备两个或者更多的显示设备,而在一些项目场景,也存在着PC连接多块屏幕进行拼接显示的场景。 [0004] 传统DirectDraw显示方式不支持跨屏显示,且因为没有针对性的优化,同环境下能够同时播放显示的视频路数有限。此时一种显示路数多,显示效果流畅,支持多屏及跨屏的显示方案就显得很有必要。 发明内容[0005] 本发明是针对上述现有技术的不足,提供一种实用性强的视频画面多屏显示方法。 [0006] 本发明进一步的技术任务是提供一种设计合理,安全适用的视频画面多屏显示装置。 [0007] 本发明解决其技术问题所采用的技术方案是: [0008] 一种视频画面多屏显示方法,具有如下步骤: [0009] S1、全局初始化阶段; [0011] S2、通道初始化阶段; [0012] 在新建一路视频显示时进行通道初始化阶段; [0013] S3、显示阶段; [0014] 循环遍历每个显示设备,并显示画面在本显示设备上的部分; [0015] S4、通道释放阶段; [0016] 在关闭一路视频显示时进行通道释放阶段; [0017] S5、全局释放阶段; [0018] 在退出APP时进行全局释放阶段,释放各显示设备关联的非空全局资源。 [0019] 进一步的,在步骤S1中,在APP初始化时,调用DirectDrawEnumerateEx接口遍历系统显示设备,保存每个显示设备的显示设备句柄hMonitor和显示设备GUID gMonitorGUID到显示设备数组; [0020] 遍历显示设备数组,调用GetMonitorInfoA接口通过hMonitor获取显示设备信息; [0021] 遍历显示设备数组,创建各显示设备关联DirectDraw全局资源。 [0022] 进一步的,在步骤S2中,创建通道上下文,初始化上下文字段到空值。 [0024] (1)判断桌面坐标系下的画面显示区域showRect是否有部分在本设备显示范围内; [0025] (2)判断本通道下管理本设备的离屏表面lpDDSOffScreen是否为空或者rectSrc的宽高是否变化; [0026] (3)设置lpClipperPrimary和lpClipperBack的裁剪范围为rectDest。 [0027] 进一步的,在步骤(1)中,判断桌面坐标系下的画面显示区域showRect是否有部分在本设备显示范围内,若没有,则跳过本设备; [0028] 若有,则计算画面在原视频画面所占区域rectSrc以及画面在本设备显示区域的屏幕坐标rectDest。 [0029] 进一步的,在步骤(2)中,判断本通道下管理本设备的离屏表面lpDDSOffScreen是否为空或者rectSrc的宽高是否变化,若有变化,则创建或重建lpDDSOffScreen; [0030] 若无变化,则跳过该步骤; [0031] 将原图像rectSrc区域图像数据填充到lpDDSOffScreen,此时图像数据将从内存传输到显存。 [0032] 进一步的,在步骤(3)中,设置lpClipperPrimary和lpClipperBack的裁剪范围为rectDest,将lpDDSOffScreen数据Blt到lpDDSBack的rectDest区域,此时将进行图像缩放和像素格式转换操作,先Blt到后备表面; [0033] 将lpDDSBack的rectDest区域Blt到lpClipperPrimary的rectDest区域; [0034] 此时画面显示到本显示设备上,完成本路视频在本显示设备的显示步骤。 [0035] 进一步的,所述显示区域的判断方法如下: [0036] a、判断showRect与monitorRect横坐标是否有交集; [0037] b、判断showRect与monitorRect纵坐标是否有交集; [0038] c、判断显示区域是否与屏幕区域有交集。 [0039] 进一步的,在步骤S4中,在关闭一路视频显示时,执行释放本通道关联的资源,包括各显示设备下关联的lpDDSOffScreen; [0040] 在步骤S5中,在退出APP时,遍历显示设备数组,释放各显示设备关联的非空全局资源。 [0041] 一种视频画面多屏显示装置,包括:至少一个存储器和至少一个处理器; [0042] 所述至少一个存储器,用于存储机器可读程序; [0043] 所述至少一个处理器,用于调用所述机器可读程序,执行一种视频画面多屏显示方法。 [0044] 本发明的一种视频画面多屏显示方法及装置和现有技术相比,具有以下突出的有益效果: [0046] 为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。 [0047] 附图1是一种视频画面多屏显示方法的流程示意图。 具体实施方式[0048] 为了使本技术领域的人员更好的理解本发明的方案,下面结合具体的实施方式对本发明作进一步的详细说明。显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例都属于本发明保护的范围。 [0049] 下面给出一个最佳实施例: [0050] 如图1所示,本实施例中的一种视频画面多屏显示方法,具有如下步骤: [0051] S1、全局初始化阶段; [0052] 本阶段在APP初始化时,执行以下操作: [0053] 调用DirectDrawEnumerateEx接口遍历系统显示设备,保存每个显示设备的hMonitor(显示设备句柄)和gMonitorGUID(显示设备GUID)到显示设备数组。 [0054] 遍历显示设备数组,调用GetMonitorInfoA接口通过hMonitor获取显示设备信息,主要有monitorRect(显示设备桌面坐标系范围)等。 [0055] 遍历显示设备数组,创建各显示设备关联DirectDraw全局资源,主要有lpDD(DirectDraw对象)、lpDDSPrimary(DirectDraw主表面)、lpDDSBack(DirectDraw后备表面)、lpClipperPrimary(主表面裁剪器)、lpClipperBack(后备表面裁剪器)等。 [0056] S2、通道初始化阶段; [0057] 在新建一路视频显示时进行,主要执行以下操作: [0058] 创建通道上下文,初始化上下文个字段到空值。 [0059] S3、显示阶段; [0060] 在显示一帧视频画面时进行,该阶段循环遍历每个显示设备,并显示画面在本显示设备上的部分,在每个显示设备上主要执行以下操作: [0061] 判断showRect(桌面坐标系下的画面显示区域)是否有部分在本设备显示范围内,若没有则跳过本设备,若有则计算rectSrc(画面在原视频画面所占区域)以及rectDest(画面在本设备显示区域的屏幕坐标)。 [0062] 判断lpDDSOffScreen(本通道下管理本设备的离屏表面)是否为空或者rectSrc的宽高是否变化,有变化则创建或重建lpDDSOffScreen;若无变化,则跳过该步骤。 [0063] 将原图像rectSrc区域图像数据填充到lpDDSOffScreen,此时图像数据将从内存传输到显存。 [0064] 设置lpClipperPrimary和lpClipperBack的裁剪范围为rectDest。 [0065] 将lpDDSOffScreen数据Blt到lpDDSBack的rectDest区域,此时将进行图像缩放和像素格式转换等操作,耗时相对较长,故先Blt到后备表面,防止显示撕裂现象。 [0066] 将lpDDSBack的rectDest区域Blt到lpClipperPrimary的rectDest区域。 [0067] 此时画面显示到本显示设备上,完成本路视频在本显示设备的显示步骤。 [0068] 显示区域判断方法如下: [0069] a、判断showRect与monitorRect横坐标是否有交集; [0070] bool xCross=showRect.left [0071] monitorRect.left [0072] b、判断showRect与monitorRect纵坐标是否有交集; [0073] bool yCross=showRect.top [0074] c、判断显示区域是否与屏幕区域有交集; [0075] bool cross=xCross&&yCross; [0076] 在上述显示方法中,假定源视频宽高分别为imageWidth、imageHeight,rectSrc和rectDest的计算方法如下: [0077] (1)计算rectDest对应区域桌面坐标系范围rectDestTemp; [0078] rectDestTemp=showRect [0079] rectDestTemp.left=max(rectDestTemp.left,monitorRect.left)[0080] rectDestTemp.left=min(rectDestTemp.left,monitorRect.right)[0081] rectDestTemp.right=max(rectDestTemp.right,monitorRect.left)[0082] rectDestTemp.right=min(rectDestTemp.right,monitorRect.right)[0083] rectDestTemp.top=max(rectDestTemp.top,monitorRect.top) [0084] rectDestTemp.top=min(rectDestTemp.top,monitorRect.bottom)[0085] rectDestTemp.bottom=max(rectDestTemp.bottom,monitorRect.top)[0086] rectDestTemp.bottom=min(rectDestTemp.bottom,monitorRect.bottom)[0087] (2)计算rectSrc [0088] int showWidth=showRect.right‑showRect.left [0089] int showHeight=showRect.bottom‑showRect.top [0090] rectSrc.left=(rectDestTemp.left‑showRect.left)*imageWidth/showWidth[0091] rectSrc.right=(rectDestTemp.right‑showRect.left)*imageWidth/showWidth [0092] rectSrc.top=(rectDestTemp.top‑showRect.top)*imageHeight/showHeight[0093] rectSrc.bottom=(rectDestTemp.bottom‑showRect.top)*imageHeight/showHeight [0094] (3)计算rectDest [0095] rectDest.left=rectDestTemp.left‑monitorRect.left [0096] rectDest.right=rectDestTemp.right‑monitorRect.left [0097] rectDest.top=rectDestTemp.top‑monitorRect.top [0098] rectDest.bottom=rectDestTemp.bottom‑monitorRect.top [0099] S4、通道释放阶段; [0100] 本阶段在关闭一路视频显示时进行,主要执行以下操作: [0101] 释放本通道关联的资源,主要有各显示设备下关联的lpDDSOffScreen等。 [0102] S5、全局释放阶段; [0103] 遍历显示设备数组,释放各显示设备关联的非空全局资源,主要有lpDD、lpDDSPrimary、lpDDSBack、lpClipperPrimary、lpClipperBack等。 [0104] 其中,全局初始化阶段,枚举所有显示设备,并记录各个显示设备关联句柄及其显示范围在桌面坐标系下的矩形坐标,并为每个显示设备创建其关联的DirectDraw对象实例。 [0105] 显示阶段,循环遍历各显示设备,判断显示区域是否与现实设备区域有交集。仅在有交集是创建交叉区域的离线表面资源,实现按需创建,减少显存等资源占用;仅传输交叉区域的视频数据到离屏表面,实现按需传输,降低总线带宽等资源占用。 [0106] 简言之,本方法通过应用层精确控制DirectShow资源的创建和操作,减少缺省使用方式下多余资源的创建和数据传输,从而以最小的代价实现满足需要的显示效果,从而保证显示效果并提高并发量。 [0107] 基于上述方法,本实施例中一种视频画面多屏显示装置,包括:至少一个存储器和至少一个处理器; [0108] 所述至少一个存储器,用于存储机器可读程序; [0109] 所述至少一个处理器,用于调用所述机器可读程序,执行一种视频画面多屏显示方法。 [0110] 上述具体的实施方式仅是本发明具体的个案,本发明的专利保护范围包括但不限于上述具体的实施方式,任何符合本发明权利要求书记载的技术方案且任何所属技术领域普通技术人员对其做出的适当变化或者替换,皆应落入本发明的专利保护范围。 [0111] 尽管已经示出和描述了本发明的实施例,对于本领域的普通技术人员而言,可以理解在不脱离本发明的原理和精神的情况下可以对这些实施例进行多种变化、修改、替换和变型,本发明的范围由所附权利要求及其等同物限定。 |