基于Rokid的生活日记Glass拍照录像应用【记小圈应用】开发实践

举报
柠檬🍋 发表于 2025/11/28 14:36:23 2025/11/28
【摘要】 通过本次 Glass记小圈应用 的开发实战,我们完整地梳理了纯眼镜端应用从功能设计、SDK集成到多媒体交互的开发流程。在拍照、录像和录音的实现过程中,我们不仅熟悉了CXR-S SDK提供的接口和回调机制,还深入理解了眼镜端在硬件性能、功耗和蓝牙传输等方面的限制与优化策略。

在智能穿戴设备日益普及的今天,AR眼镜已经不再是科幻作品中的概念,而是可以真正融入我们日常生活的工具。本文将分享一个基于 Rokid CXR-S SDK 的纯眼镜端实战项目——生活小记Glass拍照录像应用(Glass记小圈应用)。通过这一实战项目,我将带你从零构建一个能够拍照、录像、录音并进行基本媒体管理的眼镜端应用,并分享开发过程中遇到的技术细节与优化经验。
在这里插入图片描述

一、项目背景与目标

在日常生活中,我们经常希望随手记录瞬间,但拿出手机拍照或录像有时不够便利。AR眼镜的优势在于 免手持、即时记录。

在这里插入图片描述
Glass记小圈应用目标:

  1. 通过眼镜单机操作或AI场景,实现拍照、录像、录音功能。
  2. 支持拍照与录像参数自定义,如分辨率、画质、时长等。
  3. 提供回调机制,方便获取拍照图片或录像路径,实现后续数据同步或处理。
  4. 纯眼镜端实现,无需依赖移动端应用。
    信息交互模型如下。

在这里插入图片描述

二、开发环境与依赖

  • 开发语言:Kotlin
  • SDK版本:CXR-S SDK 1.0.1
  • IDE:Android Studio Arctic Fox 或以上
  • 权限:相机、麦克风、存储

在 AndroidManifest.xml 中,需要声明以下权限:

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

运行时需动态申请权限,以保证拍照、录像和录音功能正常。

三、拍照功能实现

在这里插入图片描述
CXR-M SDK 是一款移动端开发工具包,专为构建 Rokid 眼镜的配套应用和控制应用而设计。它支持手机与眼镜之间的稳定连接、数据通信、实时音视频访问以及场景自定义。非常适合需要基于手机的用户界面、远程控制或与眼镜进行高级协作的应用。目前适用于 Android 系统。

在这里插入图片描述

3.1 单机功能键拍照

通过 SDK 提供的接口 setPhotoParams(width: Int, height: Int),可以设置单机按键拍照的分辨率:

val status = CxrApi.getInstance().setPhotoParams(1920, 1080)
when (status) {
    ValueUtil.CxrStatus.REQUEST_SUCCEED -> Log.d(TAG, "单机拍照参数设置成功")
    else -> Log.e(TAG, "设置失败: $status")
}

用户按下眼镜功能键即可拍照,拍照结果存储在未同步媒体文件中。

3.2 AI场景拍照

在AI场景中,可以直接控制相机并获取图片数据:

private val photoCallback = object : PhotoResultCallback {
    override fun onPhotoResult(status: ValueUtil.CxrStatus?, photo: ByteArray?) {
        if (status == ValueUtil.CxrStatus.RESPONSE_SUCCEED && photo != null) {
            // 将WebP图片保存或处理
            savePhoto(photo, "ai_scene_photo.webp")
        }
    }
}

fun takeAiScenePhoto() {
    CxrApi.getInstance().openGlassCamera(1280, 720, 80)
    CxrApi.getInstance().takeGlassPhoto(1280, 720, 80, photoCallback)
}

Tips:AI场景拍照通过蓝牙传输图片,建议选择 较小分辨率和适中压缩质量。

3.3 获取拍照路径

如果需要获取图片的文件路径,可以使用 takeGlassPhoto(width, height, quality, PhotoPathCallback):

private val photoPathCallback = object : PhotoPathCallback {
    override fun onPhotoPath(status: ValueUtil.CxrStatus?, path: String?) {
        if (status == ValueUtil.CxrStatus.RESPONSE_SUCCEED && path != null) {
            Log.d(TAG, "拍照文件路径: $path")
        }
    }
}

fun takePhotoWithPath() {
    CxrApi.getInstance().takeGlassPhoto(1280, 720, 90, photoPathCallback)
}

四、录像功能实现

4.1 录像参数设置

通过 setVideoParams(duration, fps, width, height, unit) 可以自定义录像参数:

CxrApi.getInstance().setVideoParams(
    duration = 60, fps = 30,
    width = 1280, height = 720,
    unit = 1 // 1=)

4.2 开启与关闭录像场景

录像通过控制场景实现:

fun startVideoRecord() {
    CxrApi.getInstance().controlScene(ValueUtil.CxrSceneType.VIDEO_RECORD, true, null)
}

fun stopVideoRecord() {
    CxrApi.getInstance().controlScene(ValueUtil.CxrSceneType.VIDEO_RECORD, false, null)
}

用户可以通过手势或按键快速开启/关闭录像,实现便捷记录。

五、录音功能实现

录音可以结合AI应用场景实现,SDK提供回调监听音频流:

private val audioListener = object : AudioStreamListener {
    override fun onStartAudioStream(codecType: Int, streamType: String?) {
        Log.d(TAG, "音频流开始,codec=$codecType")
    }
    override fun onAudioStream(data: ByteArray?, offset: Int, length: Int) {
        // 处理PCM或Opus音频数据
    }
}

fun startAudioRecord() {
    CxrApi.getInstance().setAudioStreamListener(audioListener)
    CxrApi.getInstance().openAudioRecord(codecType = 1, streamType = "DailyNote")
}

fun stopAudioRecord() {
    CxrApi.getInstance().closeAudioRecord("DailyNote")
}

六、服务端处理与场景落地应用

虽然 Glass记小圈 应用实现了完整的拍照、录像、录音等能力,且可在眼镜端本地完成所有操作,但在真实生活场景中,如果仅依赖眼镜本地存储会出现诸多限制:
如存储空间有限、文件难以整理、无法跨设备查看、AI 分析难以在本地运行等。
因此服务端的作用绝不仅仅是“接收与后处理”,而是构建一个完整的生活记录系统的关键基础。
为了便于理解,我们从“真实使用场景”出发,拆解服务端的作用。

6.1 场景:生活记录归档(Life Log场景)

在 Glass 记小圈 应用的使用场景中,最核心、最贴近用户日常的是“生活记录归档”。AR 眼镜的优势在于解放双手、随时可用,使其非常适合承担低干扰、不打断当下体验的实时记录任务。因此,Life Log 的设计不仅仅是简单的拍照与录像,而是围绕“如何让用户毫无感知地记录生活点滴,并在之后自动归类、整理、备份”这一目标构建的完整交互链路。
在这里插入图片描述

①即时记录:无感操作的核心体验

在真实的生活场景中,例如散步、骑行、与朋友聊天、做手工、下厨时,用户往往没有额外的手去操作设备。眼镜端的操作设计因此强调“轻触即用”——短按拍照、长按录像、语音触发录音,整个操作无需用户停下手中的动作,也不会改变当下沉浸体验。
在这一模式下,眼镜端利用 CXR-S SDK 对相机和音频模块进行轻量化调用,确保操作延迟极低。例如拍照调用通常在 150–300ms 内完成拍摄与写入,用户几乎无感延时;录音与录像在触发后会立即返回场景启动状态,确保不会错过关键画面。
即时记录的核心,是让设备成为用户身体的延伸,而不是额外的负担。

在这里插入图片描述

②本地归档:结构化存储与未同步机制

为了保证数据安全性和高可靠性,眼镜端采用“本地优先”的存储策略:

  • 每一张照片、视频、录音,都先写入本地的未同步目录(/media/unsync)
  • 并生成组件化的元数据(时间戳、类型、大小、参数、触发方式)
  • 在 UI 侧实时更新历史记录列表,让用户能够随时回看
    这样的机制允许在无网络、弱网络或用户尚未登录云端服务的场景下,依然能保持完整的记录。
    为了避免存储膨胀,系统还实现了轻量化资源回收策略,例如:
  • 对于超长视频自动按 10 分钟切片
  • 自动压缩 AI 场景下的 WebP 图片
  • 本地媒体达到阈值时触发提示与自动清理候选列表
    本地归档系统在极端情况下也能保证记录不丢,从而构建 Life Log 的基础可靠性。

6.2 场景:AI 辅助生活的小助手(未来扩展场景)

在 Glass 记小圈 的整体架构中,服务端不仅承担媒体存储与同步的角色,更是未来智能能力的核心承载者。随着用户逐渐形成连续的拍照、录像、录音习惯,系统会积累大量生活切片,而真正的价值在于如何将这些碎片加工为“可理解、可索引、可回顾”的记忆资产。这正是 AI 生活助手的作用所在。

在这里插入图片描述
AI 智能总结:把一天的碎片拼成“生活日记”

用户的一天通常由散落的照片、零星的视频和短暂的录音组成。单独看这些媒体,它们只是孤立的文件;但经过 AI 处理后,它们可以被组织成一篇有结构、有内容、有主题的自动化日记。
这一过程涉及多个服务端能力协同工作:

(1)图像理解与场景识别
服务端模型会对每张图片进行:

  • 场景类别识别(如“公园”“厨房”“办公室”)
  • 物体检测(如“猫”“植物”“餐盘”)
  • OCR 提取文字(如菜单、路牌、白板内容)
    这些语义将作为后续日记生成的“素材语料”。

在这里插入图片描述
(2)视频摘要处理
视频比图片包含更丰富但更分散的信息,因此需要:关键帧提取、场景变化检测、物体持续性跟踪、简短文本摘要(如“制作食物过程片段”“散步中的街景”)。服务端可根据时长自动压缩信息量,使其更适合写入生活日记。
(3)音频转写与内容提取
对于会议、对话、分享记录等音频片段,服务端可执行:ASR 语音转文字、说话人区分、关键句抽取,情绪识别(如激动、开心、平静)。这让日记不仅记录“做了什么”,也记录“说了什么”。
(4)AI 生成式总结:构建结构化生活小记
当一天的媒体数据被整合后,AI 日记生成器会根据时间线、地理位置(如用户开启定位)、场景标签与内容文字生成一段结构化叙述。例如:

下午 2 点,你在植物园拍摄了 7 张照片,AI 识别到三类植物:向日葵、薰衣草与芦荟。
稍后你录制了一段 18 秒的视频,内容是你在园区小径散步。
当天总计拍摄 3 分钟视频、记录 2 段语音、10 张照片,整体主题偏向“自然与户外活动”。

这样的“生活小记”不再是一堆文件,而是一个可阅读、可分享、可检索的记忆摘要。

6.3服务层处理逻辑

在 Glass记小圈应用中,虽然所有功能均可在眼镜端完成,但为了实现数据集中管理、云端同步、备份以及后续 AI 分析,我们需要搭建一个服务端系统,用于接收、存储和管理多媒体文件。服务端主要职责包括:

  1. 文件接收与存储:通过 HTTP 或 WebSocket 接收眼镜端上传的照片、视频、音频文件,并存储到服务器指定路径。
  2. 文件元数据管理:记录文件名称、路径、拍摄时间、类型等信息,方便后续检索和展示。
  3. 异常处理与重试机制:处理传输中断、文件损坏、重复上传等问题。
  4. 接口设计:提供 RESTful API 供眼镜端上传和获取数据。
package com.glassserver.controller

import com.glassserver.model.MediaFile
import com.glassserver.service.MediaService
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.*
import org.springframework.web.multipart.MultipartFile

@RestController
@RequestMapping("/media")
class MediaController(private val mediaService: MediaService) {

    @PostMapping("/upload/{type}")
    fun uploadMedia(
        @RequestParam("file") file: MultipartFile,
        @PathVariable type: String
    ): ResponseEity<MediaFile> {
        return try {
            val savedFile = mediaService.saveMedia(file, type)
            ResponseEntity.ok(savedFile)
        } catch (e: Exception) {
            ResponseEntity.status(500).build()
        }
    }

    @GetMapping("/list/{type}")
    fun listMedia(@PathVariable type: String): ResponseEntity<List<MediaFile>> {
        val files: List<MediaFile> = mediaService.listMediaByType(type)
        return ResponseEntity.ok(files)
    }
}

眼镜端上传

fun uploadPhotoToServer(photoPath: String) {
    val file = File(photoPath)
    val client = OkHttpClient()
    val body = MultipartBody.Builder()
        .setType(MultipartBody.FORM)
        .addFormDataPart("file", file.name, file.asRequestBody("image/webp".toMediaType()))
        .build()

    val request = Request.Builder()
        .url("http://yourserver.com/media/upload/photo")
        .post(body)
        .build()

    client.newCall(request).enqueue(object : Callback {
        override fun onFailure(call: Call, e: IOException) {
            Log.e(TAG, "上传失败: ${e.message}")
        }

        override fun onResponse(call: Call, response: Response) {
            if (response.isSuccessful) {
                Log.d(TAG, "上传成功")
            } else {
                Log.e(TAG, "服务器返回异常: ${response.code}")
            }
        }
    })
}

这个服务端模块不仅可以支持 Glass记小圈应用的多媒体管理,也可以为未来 AI 分析、用户云端备份等功能打下基础。

七、应用交互与实战经验

在开发 Glass记小圈应用 的过程中,眼镜端的交互设计和实战经验起到了核心作用。由于应用完全运行在眼镜端,用户的操作主要依赖功能键和有限的触控/语音输入,因此在设计交互流程时必须充分考虑操作的直观性与反馈的及时性。

在这里插入图片描述
在拍照和录像功能上,我们采用单机按键和长按两种触发方式,短按用于拍照、长按用于录像的开始和结束,同时在操作过程中加入状态锁定,避免重复触发或冲突操作,保证应用的稳定性。在AI场景拍照时,为了应对蓝牙传输延迟和图片体积较大的问题,我们对分辨率和压缩质量进行了优化选择,优先使用适合传输的中低分辨率,同时通过回调机制及时获取拍照结果,并在UI中提供加载状态和完成提示,让用户明确操作是否成功。在录像和录音功能上,考虑到眼镜端硬件性能和功耗,我们在开启前设置了合理的参数,包括时长、帧率和编码类型,并通过状态回调实时监控录像、录音过程,确保异常情况下可以立即停止或重新初始化。
在数据管理方面,我们统一了照片、视频和音频的存储路径,结合未同步媒体文件夹和回调机制实现文件的本地缓存和后续同步,保证数据不会丢失,同时在UI上以列表或历史记录的方式呈现,方便用户快速回顾。在开发过程中,我们也积累了大量实战经验,包括优化蓝牙连接的重试机制、在长时间操作中合理释放资源以降低功耗、处理拍照和录音的异常情况、防止连续操作造成回调阻塞,以及在UI中提供明确的状态提示以提升用户体验。
这些实践经验不仅保证了应用的稳定性和交互流畅性,也为今后扩展多媒体功能、加入更多AI场景或优化用户体验提供了坚实基础。

八、总结

通过本次 Glass记小圈应用 的开发实战,我们完整地梳理了纯眼镜端应用从功能设计、SDK集成到多媒体交互的开发流程。在拍照、录像和录音的实现过程中,我们不仅熟悉了CXR-S SDK提供的接口和回调机制,还深入理解了眼镜端在硬件性能、功耗和蓝牙传输等方面的限制与优化策略。

在这里插入图片描述
实践中,我们积累了丰富的经验,包括参数设置优化、异常处理与重试机制、文件管理与历史记录维护,以及用户交互的直观设计与反馈提示,这些都有效提升了应用的稳定性和用户体验。此外,通过对AI场景拍照和录像功能的深入调试,我们掌握了如何在受限资源环境下平衡数据质量与传输效率,为未来扩展更复杂的多媒体和AI交互场景打下了坚实基础。总体而言,本次开发不仅让我们熟练掌握了Rokid眼镜端的核心能力,也为后续构建更完整的AR生活应用提供了宝贵的实战参考和可复用经验。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。