前段时间发布了一个 python 获取 iOS 性能数据的文章,也算开了个小口子能在获取 iOS 测试数据上更加方便了些,如果对 iOS 性能相关兴趣可以移步:https://testerhome.com/topics/27159
屏幕共享和远控平台现在发展也比较火热,但是 iOS 设备在画面同步和视频录制上,一直都没有一个比较不错的方案,也简单调研了下之前可以获取到 iOS 屏幕数据的方法:
该项目是 python 实现可以通过 USB 连接 iOS 设备进行屏幕共享,支持:
项目地址:https://github.com/YueChen-C/ios-screen-record 先点个小星星吧
brew install libusb pkg-config
brew install gstreamer gst-plugins-bad gst-plugins-good gst-plugins-base gst-plugins-ugly
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 设备进行交互,这里用个 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 数据交互
大概流程
前面交互完成后就能正式接收音视频消息了
如果想具体了解相关传输报文协议可以查看下方链接,本项目是参考这个大佬文章,最终使用 python 来实现的 https://github.com/danielpaulus/quicktime_video_hack/blob/master/doc/technical_documentation.md