2026/4/18 13:45:58
网站建设
项目流程
桂林网站建,贵州西能电力建设有限公司网站,网站服务费做啥费用,免费网站站长背景介绍
作为一名Rokid Glasses开发者#xff0c;我最近在开发一个需要AR录屏功能的应用。然而#xff0c;Rokid官方提供的CXR SDK中并没有直接封装AR录屏的功能。在查阅官方文档和API后#xff0c;我意识到需要自己探索实现方案。
经过深入研究#xff0c;我发现了通过蓝…背景介绍作为一名Rokid Glasses开发者我最近在开发一个需要AR录屏功能的应用。然而Rokid官方提供的CXR SDK中并没有直接封装AR录屏的功能。在查阅官方文档和API后我意识到需要自己探索实现方案。经过深入研究我发现了通过蓝牙HCI数据包分析并结合CXR API的方法成功实现了AR录屏功能。本文将详细介绍我的探索过程和最终解决方案。问题分析1. 官方SDK的限制Rokid CXR SDK提供了丰富的AR眼镜控制功能但在录屏方面存在以下限制没有直接的AR录屏API现有API主要面向常规应用控制文档中未提及录屏相关功能2. 技术思路由于没有直接的API我决定从以下角度入手分析官方应用Rokid AI App如何实现AR录屏蓝牙通信分析眼镜与手机之间通过蓝牙传输哪些控制指令协议逆向能否找到录屏的控制协议技术探索过程步骤1蓝牙HCI数据包抓取首先我开启了Android设备的蓝牙HCI日志功能# 开启蓝牙HCI日志adb shell setprop persist.bluetooth.btsnoopenabletrueadb shell setprop persist.bluetooth.btsnooplogmode full adb shell stop bluetooth adb shell start bluetooth# 从设备拉取日志adb pull /data/misc/bluetooth/logs/btsnoop_hci.log步骤2使用Wireshark分析数据包将抓取到的HCI日志用Wireshark打开并使用过滤器查看关键数据# 过滤RFCOMM协议 btrfcomm # 查看Scene_Control相关的包 frame contains Scene_Control步骤3发现关键数据包经过仔细分析我发现了录屏控制的关键数据包开始录屏指令02 33 00 52 00 4e 00 53 00 23 ff 93 01 00 00 00 49 05 04 75 75 53 4f 81 20 41 03 53 79 73 00 00 00 38 05 02 53 53 0d 53 63 65 6e 65 5f 43 6f 6e 74 72 6f 6c 21 7b 22 6e 61 6d 65 22 3a 22 6d 69 78 5f 72 65 63 6f 72 64 22 2c 22 6f 70 65 6e 22 3a 74 72 75 65 7d 46停止录屏指令02 33 00 52 00 4e 00 53 00 23 ff 93 01 00 00 00 49 05 04 75 75 53 4f 81 20 41 03 53 79 73 00 00 00 38 05 02 53 53 0d 53 63 65 6e 65 5f 43 6f 6e 74 72 6f 6c 21 7b 22 6e 61 6d 65 22 3a 22 6d 69 78 5f 72 65 63 6f 72 64 22 2c 22 6f 70 65 6e 22 3a 66 61 6c 73 65 7d 46步骤4解析协议格式通过分析数据包我发现了协议的结构Scene_Control!{name:mix_record,open:true/false}这是一个简单的JSON格式控制指令name: 场景名称AR录屏对应mix_recordopen: 控制开关true开始录屏false停止录屏解决方案实现基于以上分析我利用CXR SDK现有的CxrApi构建了AR录屏控制功能1. 核心场景控制函数funcontrolScene(sceneType:String,enable:Boolean,extraArgs:String):ValueUtil.CxrStatus{Log.i(CxrApi,controlScene sceneType:$sceneType, enable:$enable, extraArgs:$extraArgs)varstatusValueUtil.CxrStatus.REQUEST_FAILEDreturntry{// 构建JSON参数valjsonJSONObject().apply{put(name,sceneType)put(open,enable)if(extraArgs.isNotBlank()){put(param,extraArgs)}}valjsonStringjson.toJSONString()Log.i(CxrApi,sceneJson:$jsonString)// 创建Caps对象并写入数据valcapsCaps().apply{write(Scene_Control)write(jsonString)}// 发送控制请求statusCxrController.getInstance().request(CxrApi.getInstance().w,Sys,caps,null)status}catch(e:Exception){Log.e(CxrApi,controlScene error:${e.message})ValueUtil.CxrStatus.REQUEST_FAILED}}2. 封装的AR录屏功能// 封装的AR录屏功能funcontrolSystemMixRecord(toOpen:Boolean){when(controlScene(mix_record,toOpen)){ValueUtil.CxrStatus.REQUEST_SUCCEED-{Log.d(TAG,Video record${if(toOpen)startedelsestopped})}ValueUtil.CxrStatus.REQUEST_FAILED-{Log.e(TAG,Failed to${if(toOpen)startelsestop}video record)}ValueUtil.CxrStatus.REQUEST_WAITING-{Log.e(TAG,Requested but Glasses is not ready)}else-{Log.e(TAG,Unknown error)}}}// 启动AR录屏funstartARRecording(){controlSystemMixRecord(true)}// 关闭AR录屏funstopARRecording(){controlSystemMixRecord(false)}3. 完整的使用示例classARRecordingActivity:AppCompatActivity(){privatelateinitvararRecordingController:ARRecordingControlleroverridefunonCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)setContentView(R.layout.activity_ar_recording)arRecordingControllerARRecordingController()// 开始AR录屏findViewByIdButton(R.id.btn_start_record).setOnClickListener{arRecordingController.startARRecording()}// 停止AR录屏findViewByIdButton(R.id.btn_stop_record).setOnClickListener{arRecordingController.stopARRecording()}}overridefunonDestroy(){super.onDestroy()// 确保停止录屏arRecordingController.stopARRecording()}}技术细节说明1. 协议栈分析通过HCI日志分析我了解到完整的通信协议栈应用层: Scene_Control{name:mix_record,open:true} ↓ 传输层: RFCOMM (蓝牙串口仿真协议) ↓ 数据链路层: L2CAP ↓ 物理层: 蓝牙HCI2. 关键发现场景名称:mix_record表示混合录制可能同时录制AR画面和音频控制参数: 只需要简单的开关控制系统目标: 发送到Sys系统服务3. 错误处理代码中完整处理了CXR API返回的各种状态REQUEST_SUCCEED: 请求成功REQUEST_FAILED: 请求失败REQUEST_WAITING: 设备未就绪使用注意事项1. 权限要求在AndroidManifest.xml中添加必要权限uses-permissionandroid:nameandroid.permission.RECORD_AUDIO/uses-permissionandroid:nameandroid.permission.CAMERA/uses-permissionandroid:nameandroid.permission.WRITE_EXTERNAL_STORAGE/uses-featureandroid:nameandroid.hardware.bluetoothandroid:requiredtrue/2. 设备连接状态确保设备已正确连接if(CxrApi.getInstance().isConnected()){// 设备已连接可以控制}else{// 设备未连接需要先连接Toast.makeText(this,请先连接Rokid眼镜,Toast.LENGTH_SHORT).show()}3. 录屏文件位置录制的视频默认保存在/sdcard/ScreenRecorder/vid-{timestamp}.mp4总结与展望通过这次探索我成功实现了以下目标✅ 已实现功能通过蓝牙HCI日志分析找到了AR录屏的控制协议利用现有CXR API实现了AR录屏控制提供了完整的开始/停止录屏接口完善了错误处理和状态反馈 未来展望探索更多AR场景控制功能研究视频流实时处理开发AR内容创作工具链构建AR应用开发框架致谢感谢Rokid提供的硬件平台和CXR SDK虽然某些功能没有直接提供API但通过深入的技术探索我们仍然能够实现所需的功能。希望这篇文章能够帮助到其他需要AR录屏功能的开发者。如果你有任何问题或改进建议欢迎在评论区留言交流