原文由悦辰发表于TesterHome社区网站。前段时间发表了一篇关于python获取iOS性能数据的文章,也算是一个小小的开场,让获取iOS测试数据更加方便。对iOS性能感兴趣的可以移步:https://segmentfault.com/a/11...现在屏幕共享和远程控制平台的发展比较火热,但是一直没有很好的解决方案iOS设备在屏幕同步和视频录制方面。我也简单调查了一下之前可以获取到的iOS屏幕数据。方法:iOS-minicapstf团队实现的帧率很好,缺点是不能用于多设备airplaymirror苹果多媒体多屏交互技术,效果很好,有一点缺点是手机在同一个wifi下每次都需要主动触发投屏镜像才能同步投屏com.apple.mobile.screenshotr协议,速度也比较慢。XCTest和XCUITest重新修改后的wda可以支持多种设备,但是帧率延迟还是比较低。基于WebRtc的iOS屏幕分享,这个需要SDKEmbeddedAPP支持,需要在端主动触发,操作不是很方便。Wait...这个项目介绍这个项目是一个python实现,可以通过USB连接iOS设备进行屏幕共享,支持:高帧率(30~60fps),高画质,低延迟,秒启动,无侵入(无需任何安装和代码嵌入)支持iOS多设备并行项目地址:https://github.com/YueChen-C/...先点个小星星MacOSXinstallbrewinstalllibusbpkg-config如果你想使用gstreamer媒体服务,你需要安装brewinstallgstreamergst-plugins-badgst-plugins-goodgst-plugins-basegst-plugins-uglypythoninstall-rrequirements.txtUseusbtoconnectyouriOSphone,unlock并相信它(手机锁屏不起作用)#可以使用vlc工具播放udp地址:udp/h264://@:8880#直接转发h264到udp广播,因为mac限制了udp的大小,包需要被砍掉,所以延迟会变高,暂时只做测试$main.py--udid=xxxxudp#recordh264/wav文件,使用vlc工具打开文件$main.py--udid=xxxxrecord-h264File=/home/out.h264-wavFile=/home/out.wav#gstreamermediastreamingtoolrenderingdisplayScreen,推荐方式$main.py--udid=xxxxgstreamer基本原理usb相关说明每个usb连接的设备都会有一些配置信息,当我们进行数据交互的时候,我们会使用一定的配置来和usb设备进行交互,这里我们以iOS为例devices:当我们使用库LibUsbhttps://libusb.info/获取iOSUSB设备信息时,我们可以获取5个配置信息bNumConfigurations,以及以下信息片段:DEVICEID05ac:12a8onBus020Address031==================bLength:0x12(18字节)bDescriptorType:0x1设备BCDUSB:0x200USB2.0bdeviceclass:0x0在接口BdevicesubClass上指定的0x0:0x0bdeviceprotocol:0x0bmaxpacketsize0:0x40:0x40:0x40(64bytes)0x3*********************bNumConfigurations:0x5配置1:500mA====================================如何开启隐藏配置其实在iOSUSB层也有一个隐藏配置信息,用于传输屏幕音视频相关数据。pyhton开启方式为device.ctrl_transfer(0x40,0x52,0,2,b'')发送这条命令后,再次获取配置信息时,会发现bNumConfigurations的个数变成了6。多出来的配置信息是我们想要使用的。使用此USB配置,连接相应端口后,即可传输音视频图像。接口端点定位虽然我们使用的是这个音视频传输配置,但是这个配置下有多个INTERFACE接口,但是只需要bInterfaceSubClass=0x2A这个接口,所以你也需要定位这个配置,然后你会看到有两个端口ENDPOINT0x86:BulkIN(用于接收数据)和ENDPOINT0x5:BulkOUT(用于发送数据)在INTERFACE下。关基完成了INTERFACE2:VendorSpecific===========================bLength:0x9(9bytes)bDescriptorType:0x4InterfacebInterfaceNumber:0x2bAlternateSetting:0x0bNumEndpoints:0x2bInterfaceClass:0xff供应商特定bInterfaceSubClass:0x2abInterfaceProtocol:0xffiInterface:0x11Valeria端点0x86:批量输入===============================bLength:0x7(7字节)bDescriptorType:0x5端点bEndpointAddress:0x86INbmAttributes:0x2BulkwMaxPacketSize:0x200(512字节)bInterval:0x0ENDPOINT0x5:批量输出===============================bLength:0x7(7字节)bDescriptorType:0x5端点bEndpointAddress:0x5OUTbmAttributes:0x2BulkwMaxPacketSize:0x200(512字节)bInterval:0x0如果要分析usb数据,执行:sudoifconfigXHC20up命令,然后用wiershark抓取网卡XHC20,可以看到一些usb数据交互,开始传输数据,启用隐藏的设备配置信息锁定打开传输端点并等待接收PING数据包。Packetresponse等待SYNCCWPA包接收设备音频时间戳>>>开始音频交互创建本地时间戳记录,将时间戳放入SYNCCWPA发送ASYN_HPD1(参数参考iosCoreAudio框架)发送ASYN_HPA1(参数参考iosCoreAudio框架)以及步骤6收到的设备音频时间戳接收同步AFMT并返回无错误信号(表示准备就绪)接收CVRP视频时间戳>>>开始视频交互使用本地视频时间戳使用步骤10时间戳回复发送NEED消息接收两个ASYN接收CLOK消息,创建新的时间戳记录和回复消息接收TIME消息,使用14步创建的时间回复消息前面的交互完成后,就可以正式接收音视频消息了如果想了解更多可以查看下面的链接相关的传输消息协议。本项目是根据这位大佬的文章,最终使用python实现的https://github.com/danielpaul...原文由悦晨发表于TesterHome社区网站,点击原文链接与悦晨交流,今天的知识已经吸收了~想了解更多测试开发前沿技术,结识行业大咖:欢迎关注“第十届MTSC上海大会”1个主会场+12个专场,大咖云集精英汇聚知乎、物流、开源、游戏、酷家乐、音视频、ClientServer、数字经济、绩效提升、质量保障、智能测试等12个专场
