搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
羊村懒王
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
知根知底:Flink-KafkaConsumer 详解
2
安卓前端连接springboot后端_安卓开发调用后端接口
3
计算机语言发展史_1988年左右学校学的计算机语言
4
使用 VisualVM 和 JProfiler 进行性能分析及调优_jvisualvm profiler
5
大模型基础应用框架(ReACT\SFT\RAG)技术创新及零售业务落地应用_react框架 大模型
6
layui渲染数据表格时传参_layui table.render传参数
7
PG的物理存储结构、版本控制、空间回收
8
MTK日志分析技巧_mtk mdlog分析
9
mysql报错日志查看
10
Totem Movie Player是一套在類Unix操作系統上運行的多媒體播放器,也是Ubuntu系統的預設影片播放器_中文幕播放
当前位置:
article
> 正文
牛刀 —— 汨罗网络屏幕投影软件的技术实现_gxdi截屏
作者:羊村懒王 | 2024-03-16 21:53:08
赞
踩
gxdi截屏
将电脑显示通过网络,特别是WIFI连接到另外一个显示器显示出来,又叫网络投屏,无线投屏,WIFI Display,Miracast,镜屏、转屏、切屏、同屏等等,一个典型的应用,就是无线投影,笔记本电脑通过WIFI无线,直接投影,不需要接线。
图1
主流的技术实现方式就是:在电脑发送端,通过软件将屏幕捕捉下来(就是截屏),压缩后,通过网络传输到另外一个电脑接收后显示。另外这个设备可以是Windows、Linux或者Android等系统的电脑,或者定制的嵌入式接收解码设备,其实也是个电脑。原理说起来非常简单,但是实现起来却不简单,看看是哪些些企业在做这个,就应当明白这不是牛刀杀鸡。
原来有一些专业厂商,比如Display Link 的USB显示器,还有比如华为等一些硬件厂商生产销售的无线同屏器等,还有一些纯粹做软件的比如台湾的 MirrorOp等等,后来intel专门开发了WIDI无线投屏技术(Windows8.1以后,已经合并到微软的Miracast中),苹果有所谓airplay,谷歌有Miracast,微软也在Win8.1开始专门开发了所谓的WIFI Miracast,至此,这群顶尖的科技大腕基本到齐,来折腾这个网络投屏的东西。
实现技术就是两个3步曲,发送端:截屏→压缩→传输,接收端:接收→解压→显示。
在Windows系统里面,最简单的截屏函数,由微软提供GDI API,使用超级简单也可靠,但是速度比较慢,消耗系统资源较多;原来微软也提供了Mirror Driver就是,就是所谓镜像驱动方式,在XP下,可以明显提高截屏速度,减少CPU占用,虽然Win7也支持,但是在Win7下,速度和CPU占用没有什么优势。Win8以后,微软抛弃了镜像驱动方式,新支持GXDI方式,截屏速度和CPU占用比GDI有压倒性优势,但是也有些问题,比如有些窗口系统栏不能捕捉,有时引起鼠标闪烁,双显示卡使用NV显示不支持等等。
按常理来想象,毕竟最终是显示卡显示,因此在显示卡直接拦截捕捉显示数据应当是个好办法。果然,intel和NVIDIA确有这种想法。intel在Media SDK中提供了屏幕捕捉插件,按照其说明,可以直接快速将显示卡的数据捕捉出来,但是文档说的清楚,在Windows 8.1以上,也是由系统的SDK实现的,我只能理解为由GXDI接口实现的。NVIDIA提供了Screen Capture SDK,看样子明显不是采用windows系统截屏SDK实现,应当是直接捕捉显示卡里面的数据,并且就一个函数,就可以直接压缩为H264数据,可惜,Screen Capture SDK只能在专业显示卡支持,普通市面销售的显示卡却不支持。AMD显示卡没有发现有类似SDK放出来。因此,在本软件中采用的是GXDI和GDI二种捕屏技术,在Win8.1以上的时候,优先采用GXDI,不支持时自动采用GDI方式,但是用户也可以强制指定GDI方式。
图2
捕捉屏幕后,如果不压缩,直接传输,当然效果最好,并且延迟也最小,但是数据量太大。按照1920*1080的屏幕,捕捉屏幕的数据是RGBA,这样,一个屏幕的数据量就是:1920*1080*4=8309760bytes,根据经验,每秒25帧是流畅的基本要求,如果要实时显示效果好,应当要到30帧以上,如果按照30帧,则30*8309760 = 249292800bytes,网络速度是安装bps计算的,也就是每个bytes要8个bps,这样就要求网络带宽249292800*8=1994342400,大约是1900G/s,这个要万兆以太网才可能,普通的WIFI网络实际网络速度一般都在5MBbytes/s以下,因此压缩是必须的。H265是最热门的压缩技术,目前大家都看好,但是,经过实践检验,需要占用CPU资源太大,虽然可以节省网络带宽,但是容易导致发送端CPU过高占用,引起卡顿。H264是目前最成熟的压缩方式,特别是在GPU支持时,还可以明显降低CPU这要求。本软件会自动检测,在支持Intel Media SDK的GPU时,就默认采用GPU压缩,当前主流的Intel CPU包含主流低档的凌动CPU都已经支持,因此压缩屏幕占用的CPU非常低,一般是在15%以下。不过随着软、硬件发展,相信将来是H265的天下,本软件默认采用H264,但用户可以手动选择H265压缩方式。
图3
传统以太网是一个没有优先级别的网络,但是目前的以太网,也支持优先级别。人耳朵对于声音最敏感,本软件采用了声音传输最高,其次是视频的网络QOS API。目前常规的标准方式投屏是,捕捉屏幕后,按照一定的标准压制成为H264或者H265的标准流格式,这样符合某种标准的接收终端就可以接收、解压并且播放了。但是,实践中发现,以太网,特别是WIFI网络是个非常不稳定的网络,电脑的CPU等,也是非常不同的,如果采用这种流的方式,往往难以保证好效果。本软件采用一对一的方式,每一帧图片压缩和解压播放都是全部自动适应的结果,这样保证了发送端,接收端系统、CPU、网络全部安装尽量优化自动适应,实际证明,这种做法效果良好,可以在300K左右,普通i3电脑流畅投屏高清电影,用户无明显感觉延迟,发送端CPU占用20%左右,效果非常理想。
XP下捕捉声音比较复杂,该系统已经退出主流,因此本软件只支持Win7以上声音发送,当然XP作为接受端可以播放声音。WASAPI捕捉声音占用CPU少,速度快,通用性强,效果良好。采用aac压缩,开初打算采用100%质量,但是个人仔细听多个场景,感觉85%质量和100%听不出什么区别,因此采用85%aac压缩音频质量。人耳对延迟的敏感程度比眼睛要高多了,因此声音和屏幕是分别2个SOCKET端口发送,分别是4568和4567,发送声音的优先级别高于发送屏幕。
作为声音捕捉发送,声音延迟是不可能彻底避免的,如果延迟不多,感觉不大,比如我个人感觉,声音延迟300ms(毫秒)以内,没有明显感觉,如果大于300毫秒,逐渐感觉明显起来;本软件在640ms左右的时候,就会强制同步。如果开始就缓存一定声音再播放,效果会更加顺滑些,但是就会引起延迟,本软件采取的策略是实时性优先,不缓存,立即播放,允许一定延迟积累。软件会实时显示投屏和投音的的网络和延迟情况:
图4
网络投屏,如果效果不好,2个方面的原因多见,一个是电脑配置或者系统运行太多任务问题,导致CPU占用太高,如果发现CPU老是占在100%,这样效果就差了。AMD的CPU容易出现这些情况,好在目前AMD CPU的笔记本少见了。Intel CPU目前大都支持GPU的H264硬件压缩,CPU占用就低了。另外一个主要问题是网络问题了。
本软件一般速度有300K/S就可以流畅投屏,这样相当于网络速度2.4Mbps,是一个非常容易满足的要求,我采用一个10年前购买恐龙级别的磊科AP,穿过一堵墙,网络速度测试只有300K/S,也可以流畅投屏。但是在WIFI环境下,有些一些效果很差的AP,还有些网络复杂网络环境,导致超烂的WIFI网络状况,为了帮助用户诊断投屏问题,本软件专门实现了网络速度测试,只需要一个按钮,就一目了然,如果发现网络不能满足时,方便查找解决。一般正常WIFI连接时,在一个AP下的2台电脑,速度超过1MB/S,这样可以保证1920(1080流畅投屏,但是,有时在网络通过多个AP路由,或者信号条件不好时,WIFI网络速度下降到100~200K/S或者更低,投屏将明显卡顿。
因为有些网络设备会对重复的数据进行压缩或者优化,因此本网速度测试是通过每个数据都是产生随机数字发送,避免这种压缩优化的影响。当网络速度很快时,比如高速有线网络,因为CPU产生随机数字速度制约,可能会不能发挥出高速网络速度,因而测得网速可能偏低,但是对于比较低速的WIFI网络,这个影响应当不大。
图5
本软件分为发送端和接收端,分部在不同电脑执行。执行发送端后,会自动通过UDP广播查找同一局域网的接收端,并填充到“投屏到”按钮右边的多选输入框中。由于UDP广播不能过路由,因此不能自动查找跨局域网电脑。但投屏可以跨局域网,用户可以直接填入接收端的IP地址或者主机名称,再按“投屏到”按钮即可。本软件只会在软件启动和IP地址变化时才发送UDP查询广播,避免轮询发送UDP广播导致网络负担。
上次投屏成功的IP地址或者主机名称,会保存到注册表中,最多缓存3个,下次发送端软件会读取这个值。如果是上次缓存中的地址,同时UDP广播查找发现了,就会直接出现在输入框中,否则,下次软件启动时,输入框最上面一行是空,下面依次填入UDP广播发现的接收端IP地址,最底部是上次投屏成功缓存的IP或者主机名称。
要发送成功,一个必要条件是发送端可以通过TCP/IP连接到接收端,如果垮网段,必须保证接收端可以访问。比如要通过互联网将屏幕投影到接收端,则接收端应当有公网IP地址或者设置端口映射的方式,这个可以发通过送端ping接收端来进行测试验证。
如果没有AP,需要直连,可以直接将发送端或者接收端作为AP(微软叫做承载网络),这样也可以无需AP,直接点对点连接。
图6
WIFI Miracast,,仅限于WIFI直连使用,不能通过联网;毕竟电脑通常是联入网络使用的,这是常态,几乎相当要接电一样,因此,采用本软件这种自动发发现接收端,并且一键转屏的方式最直接和方便。
采用本软件发送屏幕到投影仪,屏幕的自动适应比直接连接显示线材要强多了,不需要改变发送电脑本身屏幕分辨率,接收端完全自动适应。默认是保持发送端屏幕显示长宽比例,用户也可以指定全屏显示,有如下3个选项:
图7
在发送端和接收端显示比例是一样的时候,则接收端总是满屏显示。
在发送端投屏到接收端如果屏幕比例不相同情况下,接收端有2种显示方式:
一是接收端保持发送端的显示比例,不拉伸或者缩小,这样,图像就不失真,但是也就不满屏;该情况下,又分2种技术实现方式,一种是采用CPU计算,软件拉伸,这样兼容性最好,适合各种情况,因此是默认选项。另外一种,是由显示卡和显示器固件实现拉伸,等于就是调整屏幕分辨率实现,这样效果很好,速度最快,不占用CPU,目前测试电脑显示器基本没有问题,但是,某些硬件,比如某些品种康佳电视机做显示设备,可能会不满屏,硬件拉伸兼容性比软件拉伸稍差。
在发送端和接收端协商发送屏幕尺寸时,本软件确定尺寸是最小的一端,理由很简单,发送更大尺寸屏幕图像不会提高最终显示效果,但是却会消耗更多的网络和计算资源。如果发送端和接收端屏幕尺寸一样,当然就不会发生缩放。
每秒帧数,这是投屏最终显示流畅效果最终的指标,每个环节都有影响,包括屏幕捕捉,压缩,传输,解压缩,缩放拉伸,显示。其中,显示分辨率是直接影响到每个环节的指标,如果需要提高每秒帧数,改进流畅程度,缩小显示分辨率效果直接而明显。
接收端在运行是,会阻止电脑进入休眠和屏幕保护,未接收时,显示接收端主机名称和IP地址:
图8
如果1分钟没有接收发送者,也没有鼠标键盘动作,会进入一个特定的屏幕保护程序,也就是10秒钟随机切换位置显示接收端主机和IP地址,如下:
图9
接收端默认是先来占住的策略,就是接收者正在接收时,另外一个发送者发送将会失败,并且会提示是具体哪个发送者正在发送。用户也可以设置接收者为抢来抢去的策略。由于局域网是内网,WIFI链接本身就可以设置密码,因此没有必要再在这个上面增加密码设置。
汨罗是单词Mirror(镜像)的近音,也是一个地名,听说地名不能注册商标。原来去申请过2个商标,耗费若干钱财,但是也不成功。取地名不保护,也就免得别人反而申请商标来指责我侵权了,这种教训也是有的。
2012年的时候,本人从事嵌入式系统开发的时候,曾经在飞思卡尔IMX53和RTL8511上面开发,初步实现了电脑传屏接收端的原型,嵌入式系统是linux,在ubuntu 12.04上面开发和编译,后来为了开发调试方便,将客户端改到Windows下,之后,也曾经编译开发过Andriod的版本,Andriod下有可以使用的版本,但是目前没有公开发布,现在总算搞出一个Windows发送端和接收端的成品出来,投屏效果已经感觉很理想了。
本软件完全免费下载安装使用,如果不注册,会在投屏显示为注册版字样,除此之外没有其他限制。
软件下载地址(新手只需要下载一个网络屏幕投影安装程序的文件即可):
http://pan.baidu.com/s/1dFh2EFf
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/羊村懒王/article/detail/252221
推荐阅读
article
napi
机制_
napi
_
threaded
_poll...
napi
简要记录netif_
napi
_add软中断NIC硬件中断
napi
_
threaded
_poll任务函数软中断处理函...
赞
踩
article
linux
网卡
的
napi
模式,
NAPI
方式
的
实现 (
linux
网络子系统学习 第三节 )...
Linux 内核协议栈中报文接收
的
设计思路:
NAPI
接口和旧接口两者有一下相同点:(1)、对报文
的
处理都应该放在软中断中...
赞
踩
article
BLE
一些消息
的
缩写
的
解析
_
ble
的
cmd
指令
是
什么
意思?...
BLE
有许多约定俗成
的
缩写以及其对应
的
操作要求,这篇文章分享一下这些名称
的
解析。
_
ble
的
cmd
指令
是
什么
意思?
ble
的
...
赞
踩
article
《
第一行
代码》
res
目录下新建
layout
-
large
文件夹
不显示及创建
activity
_
main
....
《
第一行
代码》
res
目录下新建
layout
-
large
文件夹
不显示及创建
activity
_
main
.
xml
布局问题 1....
赞
踩
article
Android
Studio
实验三_
android
studio
实训报告...
Android
Studio
实验三_
android
studio
实训报告
android
studio
实训报告 ...
赞
踩
article
JavaScript
笔记_1.
javascript
中的
数字型
可以
用来
保存整数或
浮点数
(小数)。...
JavaScript
笔记初识
JavaScript
JavaScript
是什么
JavaScript
的作用浏览器执行 J...
赞
踩
article
安卓
studio
没有
java
.xml_
Android
Studio
无法执行
Java
类的
main
方法问...
Android
Studio
升级到哦最新版3.6.1后,新建了个项目,发现无法执行
Java
类的
main
方法。试了网上的各...
赞
踩
article
湖北移动
魔百盒
CM20
1
-
1
-YS_
S905L3
_
UWE562
1
DS
_emmc_单内存-当贝桌面线刷...
2、拿下盒子插头,打开USB烧录工具,加载好
固件
,点击开始,刷机软件上点开始按钮双公头USB线一头插电脑后置USB口,按...
赞
踩
article
数据结构
与
算法
-进阶(十八)
贪心
策略
_假设
有
25
分
,
10
分
,
五
分
和一
分
四中
硬币
需要找给顾客二元七角钱...
贪心
策略
的本质逻辑就是每一次都选择当前的最优解,直到得出全局的最优解,但是每一次的局部最优解不能和最终的全局最优解划上等...
赞
踩
article
鸿蒙
HarmonyOS
-
SDK
管理
使用指南
_
openharmonyos
查看
sdk
版本
...
options是oh
sdk
mgr的可选配置参数,这些参数可以直接在命令行中执行外,还可以将这些参数配置到oh
sdk
mgr...
赞
踩
article
MAC安装JDK1.8_
jdk1.8
181
for
mac
下载...
一、资源下载
jdk1.8
下载:链接:https://pan.baidu.com/s/1KkyIzv3gl4ScSANGn...
赞
踩
article
鸿蒙
开发-新建
Ability
与
使用
image
-
animator
实现图帧动画_绘制帧
鸿蒙
...
场景
鸿蒙
开发-基础组件介绍及chart组件
使用
:https://blog.csdn.net/BADAO_LIUMANG_...
赞
踩
article
在
个人电脑
上
部署
ChatGLM2
-
6B
中文对话大
模型
_
chatglm2
部署
...
ChatGLM是清华大学开源的一款支持中英双语的对话语言
模型
。经过了 1.4T 中英标识符的预训练与人类偏好对齐训练,具...
赞
踩
article
【
计算机
视觉】
OpenCV
4
高级编程与项目实战(
Python
版)【2】:操作
像素
_
opencv
4
...
像素
是构成图像的基本单位。现在看图1所示的花卉图像,这幅图看着很细腻,不过将图像的白框区域放大,会看到如图2所示的效果,...
赞
踩
article
Springboot
多级
缓存
设计与实现...
多级
缓存
是提升高并发系统性能的关键策略之一。作者:鼠鼠我捏,要死了捏_springboot
多级
缓存
springboot...
赞
踩
article
用华为
鸿蒙
HarmonyOS
DevEco Studio 创建
项目
跑个 “
hello
world
”!...
????摘要今天分享下 ——
鸿蒙
初体验–用
鸿蒙
跑个 “
hello
world
”! 的一些基本知识,欢迎关注!欢迎阅读,...
赞
踩
article
C#
毕业
设计
——基于C#+
a
s
p
.
net
+
SQL
Server
的
服装
连锁店
管理
系统
设计
与实现(毕业论...
大家好,今天给大家介绍基于C#+
a
s
p
.
net
+
SQL
Server
的
服装
连锁店
管理
系统
设计
与实现,文章末尾附有本毕业设...
赞
踩
article
android
开发bug解决方法或者studio使用问题汇总_org.
greenrobot
.gree...
(可以直接快速搜索你对应的问题)以下是我开发中遇到的一些bug以及解决方法,会不定期更新!里面也包含了一些前人的博客,直...
赞
踩
article
C#
获取
IIS
所有
站点及
虚拟目录
和
应用程序
(包含名称及
详细信息
)...
using System;using System.Collections.Generic;using System.C...
赞
踩
article
史上最全
的
大
数据
开发
八股文
【自己
的
吐血
总结
】_
大
数据
八股文
...
我本硕都是双非计算机专业,从研一下开始学习
大
数据
开发
的
相关知识,从找实习到秋招,我投递过100+公司,拿到过10+
的
of...
赞
踩
相关标签
网络
linux网卡的napi模式
嵌入式硬件
c语言
单片机
android
第一行代码
android studio
android-studio
javascript
安卓studio没有java.xml
魔百盒刷机
魔百盒固件
移动魔百盒
机顶盒ROM
盒子ROM
贪心算法
算法
数据结构
harmonyos
华为
jdk配置
环境变量
鸿蒙
ChatGLM