使用 python 实现高帧率、低延时、支持多个 iOS 设备同时屏幕共享的工具
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用 python 实现高帧率、低延时、支持多个 iOS 设备同时屏幕共享的工具相关的知识,希望对你有一定的参考价值。
参考技术A前段时间发布了一个 python 获取 ios 性能数据的文章,也算开了个小口子能在获取 iOS 测试数据上更加方便了些,如果对 iOS 性能相关兴趣可以移步: https://www.jianshu.com/p/4edf1a0cae42
屏幕共享和远控平台现在发展也比较火热,但是 iOS 设备在画面同步和视频录制上,一直都没有一个比较不错的方案,也简单调研了下之前可以获取到 iOS 屏幕数据的方法:
该项目是 python 实现可以通过 USB 连接 iOS 设备进行屏幕共享,支持:
项目地址: https://github.com/YueChen-C/ios-screen-record 先点个小星星吧
usb 连接你的 iOS 手机,解锁并信任哟(手机锁屏不行)
每个 usb 连接设备时都会有一些配置信息,我们数据交互时,会使用某个配置与 usb 设备进行交互,这里用个 iOS 设备举例:
当我们使用 LibUsb 这个库 https://libusb.info/ 获取 iOS USB 设备信息时可以获取到配置信息 bNumConfigurations 5 个, 下面部分信息片段:
事实上在 iOS USB 级别上还有个隐藏配置信息,用来传输屏幕音视频相关数据,pyhton 开启方式 device.ctrl_transfer(0x40, 0x52, 0, 2, b\'\') 发送了这个指令之后,再次获取配置信息时,就会发现 bNumConfigurations 的数量变成了6个,多出来这个配置信息就是我们要使用的,使用这个 USB 配置,并连接相应端口后,就能传输音视频画面了
虽然我们使用这个音视频传输配置,但是这个配置下面还有多个 INTERFACE 接口,但是只有 bInterfaceSubClass=0x2A 这个接口才是需要用的,因此要还需要定位到这个配置下,然后会看到 INTERFACE 下面还有两个端口 ENDPOINT 0x86: Bulk IN(用来接收数据)和 ENDPOINT 0x5: Bulk OUT(用来发送数据),到此 usb 设置相关基本完成了
如果想分析 usb 数据的话执行: sudo ifconfig XHC20 up 命令后使用 wiershark 抓网卡 XHC20 就可以看到 部分 usb 数据交互
大概流程
前面交互完成后就能正式接收音视频消息了
如果想具体了解相关传输报文协议可以查看下方链接,本项目是参考这个大佬文章,最终使用 python 来实现的 https://github.com/danielpaulus/quicktime_video_hack/blob/master/doc/technical_documentation.md
今日份的知识已摄入~
想了解更多前沿测试开发技术,结识行业大牛:
欢迎关注「第十届MTSC大会·上海」>>>
1个主会场+12大专场,大咖云集精英齐聚
12个专场包括:
知乎、物流、开源、游戏、酷家乐、音视频、客户端
服务端、数字经济、效能提升、质量保障、智能化测试
主码流说明
说明: 仅支持以下能力的设备才具有相对应的功能。
视频码流
码流类型 | ■ 活动帧率控制(ACF)功能,使用不同帧率进行录像,针对重要事件使用高帧率录像,对于定时事件使用低帧率录像。动态检测录像和报警录像的帧率可单独设置。 ■ 包括普通码流,动检码流,报警码流三种编码码流。针对不同的录像事件选择不同的编码码流。 |
编码模式 | ■ H.264 : Main Profile编码方式。 ■ H.264H : High Profile编码方式。 ■ H.264B : Baseline Profile编码方式。 ■ MJPEG : 这种编码模式下视频画面需要较高的码流值才能保证图像的清晰度,为了使视频画面达到较佳效果,建议使用相应参考码流值中的最大码流值。 |
分辨率 | 包括多种分辨率类型,每种对应的推荐码流值不同。 |
帧率(FPS) | P制:1~50帧/秒,N制:1~60帧/秒。帧率会随分辨率的不同而变化。 |
码流控制 | ■ 仅在可变码流模式下设置画质,在固定码流模式下不可设置画质。 ■ 在MJPEG编码模式下,码流控制方式只能为固定码流。 |
码流 | 在可变码流模式下,该值是码流的上限,在固定码流模式下,该值是固定值 |
I帧间隔 | 两个I帧之间的P帧数量,范围为所设帧率的大小到最大值150,建议设置为帧率的2倍。 |
SVC | 帧率可分层编码,是一种时域上的可伸缩性编码方式 默认为1,即不分层。可设置分2、3、4层编码设置 |
水印设置 | ■ 通过校验水印字符,看录像是否被篡改。 ■ 水印字符只能为数字、字母、下划线、中划线,且最长为128个字符。 |
图片码流
抓图类型 | ■ 普通抓图指在时间表设定的范围内进行抓图。 ■ 触发抓图指在触发动态检测、视频遮挡、本地报警后进行抓图。 其前提条件为: |
图片大小 | 普通抓图和触发抓图下的图片大小均与主码流分辨率保持一致。 |
图片质量 | 可选择图片质量为最好,更好,好,差,更差,最差这6个级别。 |
抓图速度 | 普通抓图和触发抓图时抓图的速率。 |
视频叠加
区域遮盖 | ■ 开启则在视频监视窗口中显示遮挡块,关闭即不显示。 ■ 可进行区域块设置,最多可设置4个区域。 |
通道标题 | ■ 开启则在视频监视窗口中显示通道标题,关闭即不显示。 ■ 可通过拖动“通道标题”框来调整通道标题的位置。 |
时间标题 | ■ 开启则在视频监视窗口中显示时间标题,关闭即不显示。 ■ 可通过拖动“时间标题”框来调整时间标题的位置。 |
地理位置 | ■ 开启则在视频监视窗口中显示地理位置,关闭即不显示。 ■ 可通过拖动“地理位置”框来调整地理位置的位置。对齐方式包括左对齐和右对齐。 |
图片叠加 | ■ 开启则在视频监视窗口中显示叠加的图片,关闭即不显示。 ■ 点击上传图片,可将本地的图片叠加到视频监视窗口中。可通过拖动黄色框来调整叠加图片的位置。 |
刷新 | 设置区域遮挡块、通道标题、时间标题、地理位置、图片叠加保存成功后,可通过刷新按钮查看设置后的效果。 |
注: 地理位置和图片叠加不能同时开启。
以上是关于使用 python 实现高帧率、低延时、支持多个 iOS 设备同时屏幕共享的工具的主要内容,如果未能解决你的问题,请参考以下文章