跳到主要内容

眼镜(TSGlasses)

TopStepComKit iOS SDK 中的眼镜模块提供了智能眼镜设备的完整控制接口,包括视频预览、音频录制、视频录制、拍照以及设备存储和媒体管理等功能。通过本模块,您可以方便地与连接的智能眼镜设备进行交互和数据传输。

前提条件

  1. 设备已成功连接到智能眼镜
  2. 已完成 SDK 初始化
  3. 确保设备电量充足
  4. 网络连接稳定(某些功能可能需要蓝牙或网络传输)

数据模型

TSGlassesMediaCount

智能眼镜设备上的媒体文件数量统计模型。

属性名类型说明
videoCountNSInteger设备上的视频文件总数(包括录制和下载的视频)
audioRecordingCountNSInteger设备上的录音文件总数(包括语音备忘录和其他音频录制)
musicCountNSInteger设备上的音乐文件总数(包括上传和系统音乐)
photoCountNSInteger设备上的照片文件总数(由设备摄像头拍摄)

TSGlassesStorageInfo

智能眼镜设备的存储信息模型,包括总存储空间和可用存储空间。

属性名类型说明
totalSpaceunsigned long long设备总存储容量(字节),表示设备的最大可用存储空间
availableSpaceunsigned long long设备可用存储空间(字节),表示可用于存储文件的剩余空间

枚举与常量

TSVideoPreviewStatus

视频预览状态枚举。

枚举值说明
TSVideoPreviewUnknown未知状态
TSVideoPreviewInactive预览未进行
TSVideoPreviewActive预览进行中

TSAudioRecordingStatus

音频录制状态枚举。

枚举值说明
TSAudioRecordingUnknown未知状态
TSAudioRecordingInactive未在录制
TSAudioRecordingActive录制进行中

TSVideoRecordingStatus

视频录制状态枚举。

枚举值说明
TSVideoRecordingUnknown未知状态
TSVideoRecordingInactive未在录制
TSVideoRecordingActive录制进行中

回调类型

类型名签名说明
PreviewVideoStatusChangedBlockvoid (^)(TSVideoPreviewStatus status)视频预览状态变化时的回调,返回新的预览状态
AudioRecordingStatusChangedBlockvoid (^)(TSAudioRecordingStatus status)音频录制状态变化时的回调,返回新的录制状态
VideoRecordingStatusChangedBlockvoid (^)(TSVideoRecordingStatus status)视频录制状态变化时的回调,返回新的录制状态
PhotoCaptureResultBlockvoid (^)(BOOL isSuccess, NSError * _Nullable error)拍照结果回调,返回是否成功及错误信息
DidReceiveVideoDataBlockvoid (^)(NSData *videoData)接收视频数据的回调,返回原始视频数据
DidCompleteVideoPreviewBlockvoid (^)(NSError * _Nullable error)视频预览完成的回调,返回错误信息(正常结束时为 nil)

接口方法

检查设备是否支持视频预览

- (BOOL)isSupportVideoPreview;

检查连接的智能眼镜设备是否支持视频预览功能。

参数类型说明
返回值BOOL如果设备支持视频预览返回 YES,否则返回 NO

代码示例:

if ([glassesInterface isSupportVideoPreview]) {
TSLog(@"设备支持视频预览");
} else {
TSLog(@"设备不支持视频预览");
}

启动视频预览

- (void)startVideoPreview:(TSCompletionBlock)completion
didReceiveData:(DidReceiveVideoDataBlock)didReceiveData
completionHandler:(DidCompleteVideoPreviewBlock)completionHandler;

启动智能眼镜的视频预览,并持续接收视频数据。

参数类型说明
completionTSCompletionBlock启动操作完成回调,返回操作成功状态和错误信息
didReceiveDataDidReceiveVideoDataBlock视频数据接收回调,每当接收到视频数据时调用
completionHandlerDidCompleteVideoPreviewBlock视频预览完成回调,预览结束时调用

代码示例:

[glassesInterface startVideoPreview:^(BOOL isSuccess, NSError * _Nullable error) {
if (isSuccess) {
TSLog(@"视频预览启动成功");
} else {
TSLog(@"视频预览启动失败: %@", error.localizedDescription);
}
} didReceiveData:^(NSData *videoData) {
// 处理接收到的视频数据
TSLog(@"接收到视频数据,大小: %lu 字节", (unsigned long)videoData.length);
// 可以将视频数据写入文件或进行处理
} completionHandler:^(NSError * _Nullable error) {
if (error) {
TSLog(@"视频预览异常结束: %@", error.localizedDescription);
} else {
TSLog(@"视频预览正常结束");
}
}];

停止视频预览

- (void)stopVideoPreview:(TSCompletionBlock)completion;

停止正在进行的视频预览。

参数类型说明
completionTSCompletionBlock停止操作完成回调,返回操作成功状态和错误信息

代码示例:

[glassesInterface stopVideoPreview:^(BOOL isSuccess, NSError * _Nullable error) {
if (isSuccess) {
TSLog(@"视频预览已停止");
} else {
TSLog(@"停止视频预览失败: %@", error.localizedDescription);
}
}];

获取视频预览状态

- (void)getVideoPreviewStatus:(void(^)(TSVideoPreviewStatus status, NSError * _Nullable error))completion;

获取当前的视频预览状态。

参数类型说明
completionvoid(^)(TSVideoPreviewStatus, NSError *)状态查询完成回调,返回当前预览状态和错误信息

代码示例:

[glassesInterface getVideoPreviewStatus:^(TSVideoPreviewStatus status, NSError * _Nullable error) {
if (!error) {
switch (status) {
case TSVideoPreviewActive:
TSLog(@"视频预览进行中");
break;
case TSVideoPreviewInactive:
TSLog(@"视频预览未进行");
break;
case TSVideoPreviewUnknown:
default:
TSLog(@"视频预览状态未知");
break;
}
} else {
TSLog(@"获取视频预览状态失败: %@", error.localizedDescription);
}
}];

注册视频预览状态变化监听

- (void)registerVideoPreviewStatusChangedBlock:(PreviewVideoStatusChangedBlock)statusChangedBlock;

注册一个块来监听视频预览状态的变化。当预览状态改变时会自动调用该块。

参数类型说明
statusChangedBlockPreviewVideoStatusChangedBlock状态变化监听块,状态改变时调用;传 nil 可移除监听

代码示例:

[glassesInterface registerVideoPreviewStatusChangedBlock:^(TSVideoPreviewStatus status) {
switch (status) {
case TSVideoPreviewActive:
TSLog(@"视频预览已启动");
break;
case TSVideoPreviewInactive:
TSLog(@"视频预览已停止");
break;
case TSVideoPreviewUnknown:
default:
TSLog(@"视频预览状态变为未知");
break;
}
}];

// 移除监听
[glassesInterface registerVideoPreviewStatusChangedBlock:nil];

启动音频录制

- (void)startAudioRecording:(TSCompletionBlock)completion;

启动智能眼镜的音频录制功能。

参数类型说明
completionTSCompletionBlock启动操作完成回调,返回操作成功状态和错误信息

代码示例:

[glassesInterface startAudioRecording:^(BOOL isSuccess, NSError * _Nullable error) {
if (isSuccess) {
TSLog(@"音频录制已启动");
} else {
TSLog(@"启动音频录制失败: %@", error.localizedDescription);
}
}];

停止音频录制

- (void)stopAudioRecording:(TSCompletionBlock)completion;

停止正在进行的音频录制。

参数类型说明
completionTSCompletionBlock停止操作完成回调,返回操作成功状态和错误信息

代码示例:

[glassesInterface stopAudioRecording:^(BOOL isSuccess, NSError * _Nullable error) {
if (isSuccess) {
TSLog(@"音频录制已停止");
} else {
TSLog(@"停止音频录制失败: %@", error.localizedDescription);
}
}];

获取音频录制状态

- (void)getAudioRecordingStatus:(void(^)(TSAudioRecordingStatus status, NSError * _Nullable error))completion;

获取当前的音频录制状态。

参数类型说明
completionvoid(^)(TSAudioRecordingStatus, NSError *)状态查询完成回调,返回当前录制状态和错误信息

代码示例:

[glassesInterface getAudioRecordingStatus:^(TSAudioRecordingStatus status, NSError * _Nullable error) {
if (!error) {
switch (status) {
case TSAudioRecordingActive:
TSLog(@"音频录制进行中");
break;
case TSAudioRecordingInactive:
TSLog(@"音频录制未进行");
break;
case TSAudioRecordingUnknown:
default:
TSLog(@"音频录制状态未知");
break;
}
} else {
TSLog(@"获取音频录制状态失败: %@", error.localizedDescription);
}
}];

注册音频录制状态变化监听

- (void)registerAudioRecordingStatusChangedBlock:(AudioRecordingStatusChangedBlock)statusChangedBlock;

注册一个块来监听音频录制状态的变化。当录制状态改变时会自动调用该块。

参数类型说明
statusChangedBlockAudioRecordingStatusChangedBlock状态变化监听块,状态改变时调用;传 nil 可移除监听

代码示例:

[glassesInterface registerAudioRecordingStatusChangedBlock:^(TSAudioRecordingStatus status) {
switch (status) {
case TSAudioRecordingActive:
TSLog(@"音频录制已启动");
break;
case TSAudioRecordingInactive:
TSLog(@"音频录制已停止");
break;
case TSAudioRecordingUnknown:
default:
TSLog(@"音频录制状态变为未知");
break;
}
}];

// 移除监听
[glassesInterface registerAudioRecordingStatusChangedBlock:nil];

启动视频录制

- (void)startVideoRecording:(TSCompletionBlock)completion;

启动智能眼镜的视频录制功能。

参数类型说明
completionTSCompletionBlock启动操作完成回调,返回操作成功状态和错误信息

代码示例:

[glassesInterface startVideoRecording:^(BOOL isSuccess, NSError * _Nullable error) {
if (isSuccess) {
TSLog(@"视频录制已启动");
} else {
TSLog(@"启动视频录制失败: %@", error.localizedDescription);
}
}];

停止视频录制

- (void)stopVideoRecording:(TSCompletionBlock)completion;

停止正在进行的视频录制。

参数类型说明
completionTSCompletionBlock停止操作完成回调,返回操作成功状态和错误信息

代码示例:

[glassesInterface stopVideoRecording:^(BOOL isSuccess, NSError * _Nullable error) {
if (isSuccess) {
TSLog(@"视频录制已停止");
} else {
TSLog(@"停止视频录制失败: %@", error.localizedDescription);
}
}];

获取视频录制状态

- (void)getVideoRecordingStatus:(void(^)(TSVideoRecordingStatus status, NSError * _Nullable error))completion;

获取当前的视频录制状态。

参数类型说明
completionvoid(^)(TSVideoRecordingStatus, NSError *)状态查询完成回调,返回当前录制状态和错误信息

代码示例:

[glassesInterface getVideoRecordingStatus:^(TSVideoRecordingStatus status, NSError * _Nullable error) {
if (!error) {
switch (status) {
case TSVideoRecordingActive:
TSLog(@"视频录制进行中");
break;
case TSVideoRecordingInactive:
TSLog(@"视频录制未进行");
break;
case TSVideoRecordingUnknown:
default:
TSLog(@"视频录制状态未知");
break;
}
} else {
TSLog(@"获取视频录制状态失败: %@", error.localizedDescription);
}
}];

注册视频录制状态变化监听

- (void)registerVideoRecordingStatusChangedBlock:(VideoRecordingStatusChangedBlock)statusChangedBlock;

注册一个块来监听视频录制状态的变化。当录制状态改变时会自动调用该块。

参数类型说明
statusChangedBlockVideoRecordingStatusChangedBlock状态变化监听块,状态改变时调用;传 nil 可移除监听

代码示例:

[glassesInterface registerVideoRecordingStatusChangedBlock:^(TSVideoRecordingStatus status) {
switch (status) {
case TSVideoRecordingActive:
TSLog(@"视频录制已启动");
break;
case TSVideoRecordingInactive:
TSLog(@"视频录制已停止");
break;
case TSVideoRecordingUnknown:
default:
TSLog(@"视频录制状态变为未知");
break;
}
}];

// 移除监听
[glassesInterface registerVideoRecordingStatusChangedBlock:nil];

拍照

- (void)takePhoto:(TSCompletionBlock)completion;

使用智能眼镜拍摄一张照片。拍摄的照片将保存到设备存储中。

参数类型说明
completionTSCompletionBlock拍照操作完成回调,返回操作成功状态和错误信息

代码示例:

[glassesInterface takePhoto:^(BOOL isSuccess, NSError * _Nullable error) {
if (isSuccess) {
TSLog(@"拍照成功");
} else {
TSLog(@"拍照失败: %@", error.localizedDescription);
}
}];

注册拍照结果监听

- (void)registerPhotoCaptureResultBlock:(PhotoCaptureResultBlock)resultBlock;

注册一个块来监听拍照结果。当拍照完成时会自动调用该块。

参数类型说明
resultBlockPhotoCaptureResultBlock拍照结果监听块;传 nil 可移除监听

代码示例:

[glassesInterface registerPhotoCaptureResultBlock:^(BOOL isSuccess, NSError * _Nullable error) {
if (isSuccess) {
TSLog(@"拍照操作完成,照片已保存");
} else {
TSLog(@"拍照操作失败: %@", error.localizedDescription);
}
}];

// 移除监听
[glassesInterface registerPhotoCaptureResultBlock:nil];

获取媒体文件数量

- (void)getMediaCount:(void(^)(TSGlassesMediaCount * _Nullable mediaCount, NSError * _Nullable error))completion;

获取智能眼镜设备上各类型媒体文件的数量统计。

参数类型说明
completionvoid(^)(TSGlassesMediaCount *, NSError *)数量查询完成回调,返回媒体数量模型和错误信息

代码示例:

[glassesInterface getMediaCount:^(TSGlassesMediaCount * _Nullable mediaCount, NSError * _Nullable error) {
if (!error && mediaCount) {
TSLog(@"视频数: %ld", (long)mediaCount.videoCount);
TSLog(@"录音数: %ld", (long)mediaCount.audioRecordingCount);
TSLog(@"音乐数: %ld", (long)mediaCount.musicCount);
TSLog(@"照片数: %ld", (long)mediaCount.photoCount);
TSLog(@"总媒体数: %ld", (long)[mediaCount totalMediaCount]);

if ([mediaCount hasAnyMedia]) {
TSLog(@"设备中有媒体文件");
} else {
TSLog(@"设备中没有媒体文件");
}
} else {
TSLog(@"获取媒体数量失败: %@", error.localizedDescription);
}
}];

获取存储信息

- (void)getStorageInfo:(void(^)(TSGlassesStorageInfo * _Nullable storageInfo, NSError * _Nullable error))completion;

获取智能眼镜设备的存储容量和可用空间信息。

参数类型说明
completionvoid(^)(TSGlassesStorageInfo *, NSError *)存储信息查询完成回调,返回存储信息模型和错误信息

代码示例:

[glassesInterface getStorageInfo:^(TSGlassesStorageInfo * _Nullable storageInfo, NSError * _Nullable error) {
if (!error && storageInfo) {
unsigned long long totalSpaceGB = storageInfo.totalSpace / (1024 * 1024 * 1024);
unsigned long long usedSpaceGB = [storageInfo usedSpace] / (1024 * 1024 * 1024);
unsigned long long availableSpaceGB = storageInfo.availableSpace / (1024 * 1024 * 1024);
double usagePercentage = [storageInfo usagePercentage];

TSLog(@"总存储空间: %llu GB", totalSpaceGB);
TSLog(@"已使用空间: %llu GB", usedSpaceGB);
TSLog(@"可用空间: %llu GB", availableSpaceGB);
TSLog(@"使用百分比: %.2f%%", usagePercentage);
TSLog(@"存储信息: %@", [storageInfo formattedStorageInfo]);

// 检查是否有足够空间录制 500MB 的视频
unsigned long long requiredSize = 500 * 1024 * 1024;
if ([storageInfo hasEnoughSpaceForSize:requiredSize]) {
TSLog(@"设备有足够空间");
} else {
TSLog(@"设备空间不足");
}
} else {
TSLog(@"获取存储信息失败: %@", error.localizedDescription);
}
}];

注意事项

  1. 设备连接状态:所有接口方法都需要确保设备已成功连接,否则会返回错误。

  2. 视频数据处理:在 startVideoPreview 方法的 didReceiveData 回调中接收到的视频数据需要及时处理,避免内存溢出。

  3. 状态监听的生命周期:注册的状态变化监听块会一直保持活动状态,直到传入 nil 移除监听或对象被释放。

  4. 并发操作限制:不应同时启动多个录制或预览操作(如同时进行视频录制和音频录制需谨慎处理)。

  5. 存储空间检查:在进行视频或音频录制前,建议先通过 getStorageInfo 查询可用空间,确保有足够的存储容量。

  6. 错误处理:所有操作都可能由于设备断连、电量不足、存储满等原因失败,需要妥善处理返回的错误信息。

  7. 资源释放:当不再需要监听状态变化时,应及时调用相应的注册方法并传入 nil 来移除监听,避免内存泄漏。

  8. 数据格式:存储空间相关的数据以字节(bytes)为单位,计算 GB/MB 时需要按照 1GB = 1024³ 字节进行转换。