关于python:使用-python-实现高帧率低延时支持多个-iOS-设备同时屏幕共享的工具

7次阅读

共计 3317 个字符,预计需要花费 9 分钟才能阅读完成。

原文由 YueChen 发表于 TesterHome 社区网站,点击原文链接可与 YueChen 交换。

前段时间公布了一个 python 获取 iOS 性能数据的文章,也算开了个小口子能在获取 iOS 测试数据上更加不便了些,如果对 iOS 性能相干趣味能够移步:https://segmentfault.com/a/11…

屏幕共享和远控平台当初倒退也比拟炽热,然而 iOS 设施在画面同步和视频录制上,始终都没有一个比拟不错的计划,也简略调研了下之前能够获取到 iOS 屏幕数据的办法:

  • iOS-minicap stf 团队实现的帧率十分不错,毛病无奈多台设施
  • Airplay mirror 苹果多媒体多屏互动技术,成果都很好,有一点点缺点就是同一个 wifi 下每次须要手机被动触发屏幕镜像才能够同步画面
  • com.apple.mobile.screenshotr 协定,这个也挺慢的
  • XCTest 和 XCUITest 二次革新的 wda 能够反对多台设施,然而帧率延时还是偏低
  • 基于 WebRtc iOS 屏幕共享,这个须要 SDK 嵌入 APP 反对,而且须要端上被动触发,操作起来不是很不便。
  • 等等 …

本我的项目介绍

该我的项目是 python 实现能够通过 USB 连贯 iOS 设施进行屏幕共享,反对:

  • 高帧率(30〜60fps)
  • 高画质
  • 低提早
  • 秒启动
  • 非侵入性(无需任何装置和代码嵌入)
  • 反对 iOS 多设施并行

我的项目地址:https://github.com/YueChen-C/… 先点个小星星吧

Mac OSX 装置

  1. brew install libusb pkg-config
  2. 如需应用 gstreamer 媒体服务则须要装置 brew install gstreamer gst-plugins-bad gst-plugins-good gst-plugins-base gst-plugins-ugly
  3. python install -r requirements.txt

应用

usb 连贯你的 iOS 手机,解锁并信赖喲(手机锁屏不行)

# 能够应用 vlc 工具播放 udp 地址:udp/h264://@:8880
# 间接转发 h264 到 udp 播送,因为 mac 限度 udp 大小,要切割包,所以延时会变高,临时仅作为测试应用
$ main.py --udid=xxxx udp

# 录制 h264/wav 文件, 应用 vlc 工具关上文件
$ main.py --udid=xxxx record -h264File=/home/out.h264  -wavFile=/home/out.wav

# gstreamer 媒体流工具渲染显示画面,举荐形式
$ main.py --udid=xxxx gstreamer

基本原理

usb 相干阐明

每个 usb 连贯设施时都会有一些配置信息,咱们数据交互时,会应用某个配置与 usb 设施进行交互,这里用个 iOS 设施举例:

当咱们应用 LibUsb 这个库 https://libusb.info/ 获取 iOS USB 设施信息时能够获取到配置信息 bNumConfigurations 5 个,上面局部信息片段:

DEVICE ID 05ac:12a8 on Bus 020 Address 031 =================
 bLength                :   0x12 (18 bytes)
 bDescriptorType        :    0x1 Device
 bcdUSB                 :  0x200 USB 2.0
 bDeviceClass           :    0x0 Specified at interface
 bDeviceSubClass        :    0x0
 bDeviceProtocol        :    0x0
 bMaxPacketSize0        :   0x40 (64 bytes)
 idVendor               : 0x05ac
 idProduct              : 0x12a8
 bcdDevice              : 0x1208 Device 18.08
 iManufacturer          :    0x1 Apple Inc.
 iProduct               :    0x2 iPhone
 iSerialNumber          :    0x3 *********************
 bNumConfigurations     :    0x5
 CONFIGURATION 1: 500 mA ==================================

如何开启暗藏配置

事实上在 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 设置相干根本实现了

 INTERFACE 2: Vendor Specific ===========================
     bLength            :    0x9 (9 bytes)
     bDescriptorType    :    0x4 Interface
     bInterfaceNumber   :    0x2
     bAlternateSetting  :    0x0
     bNumEndpoints      :    0x2
     bInterfaceClass    :   0xff Vendor Specific
     bInterfaceSubClass :   0x2a
     bInterfaceProtocol :   0xff
     iInterface         :   0x11 Valeria
      ENDPOINT 0x86: Bulk IN ===============================
       bLength          :    0x7 (7 bytes)
       bDescriptorType  :    0x5 Endpoint
       bEndpointAddress :   0x86 IN
       bmAttributes     :    0x2 Bulk
       wMaxPacketSize   :  0x200 (512 bytes)
       bInterval        :    0x0
      ENDPOINT 0x5: Bulk OUT ===============================
       bLength          :    0x7 (7 bytes)
       bDescriptorType  :    0x5 Endpoint
       bEndpointAddress :    0x5 OUT
       bmAttributes     :    0x2 Bulk
       wMaxPacketSize   :  0x200 (512 bytes)
       bInterval        :    0x0

如果想剖析 usb 数据的话执行:sudo ifconfig XHC20 up 命令后应用 wiershark 抓网卡 XHC20 就能够看到 局部 usb 数据交互

开始传输数据

大略流程

  1. 启用暗藏设施配置信息
  2. 锁定开启传输端点
  3. 期待接管 PING 包
  4. 用 PING 包响应
  5. 期待 SYNC CWPA 数据包接管设施音频 工夫戳 >>> 开始音频交互
  6. 创立本地工夫戳记录,将该工夫戳放入 SYNC CWPA 并发送
  7. 发送 ASYN_HPD1(参数参考 ios 的 CoreAudio 框架)
  8. 发送 ASYN_HPA1(参数参考 ios 的 CoreAudio 框架)和在步骤 6 中接管到的设施音频 工夫戳
  9. 接管同步 AFMT 并返回没有谬误信号(示意准备就绪)
  10. 接管 CVRP 视频 工夫戳 >>> 开始视频交互
  11. 应用本地视频 工夫戳 回复
  12. 应用步骤 10 的工夫戳 发送 NEED 音讯
  13. 接管两个 ASYN
  14. 接管 CLOK 音讯,创立新的工夫戳记录并回复音讯
  15. 接管 TIME 音讯,应用 14 步创立的工夫回复音讯

后面交互实现后就能正式接管音视频音讯了

如果想具体理解相干传输报文协定能够查看下方链接,本我的项目是参考这个大佬文章,最终应用 python 来实现的 https://github.com/danielpaul…

原文由 YueChen 发表于 TesterHome 社区网站,点击原文链接可与 YueChen 交换。

今日份的常识已摄入~

想理解更多前沿测试开发技术,结识行业大牛:欢送关注「第十届 MTSC 大会·上海」
1 个主会场 +12 大专场,大咖星散精英齐聚
12 个专场包含:
知乎、物流、开源、游戏、酷家乐、音视频、客户端
服务端、数字经济、效力晋升、品质保障、智能化测试

正文完
 0