6.9 KiB
6.9 KiB
无人机实时视频接口对接完成总结
✅ 已完成工作
1. API 层
- 添加 API 常量
changeUAVLens到HttpApiConsts
2. 实体层 (Domain/Entities)
- 创建
UavVideoStreamEntity实体类 - 定义
UavLensType枚举(广角、变焦、红外) - 定义
VideoQualityType枚举(自适应、低、中、高清晰度) - 实现 RTC 参数解析方法(appId、roomId、token、userId)
3. 数据源层 (Data/Datasources)
- 扩展
DroneStationDataSource接口,添加getUavVideoStream方法 - 实现
DroneStationDataSourceImpl.getUavVideoStream - 支持可选的镜头类型参数
- 支持自定义清晰度和 Token 有效期
- 添加详细的日志输出用于调试
4. 仓库层 (Data/Repositories)
- 扩展
DroneStationRepository接口 - 实现
DroneStationRepositoryImpl.getUavVideoStream - 使用
Either<Failure, T>模式处理错误
5. 用例层 (Domain/UseCases)
- 创建
GetUavVideoStreamUseCase - 封装业务逻辑,供 BLoC 调用
- 提供合理的默认值
6. 状态管理层 (Presentation/BLoC)
- 添加
UavVideoStreamLoad事件 - 添加
UavVideoStreamLoading状态 - 添加
UavVideoStreamLoaded状态 - 添加
UavVideoStreamError状态 - 在
DroneStationBloc中实现事件处理逻辑
7. 依赖注入 (DI)
- 导入
GetUavVideoStreamUseCase - 注册
GetUavVideoStreamUseCase为单例 - 更新
DroneStationBloc工厂,注入新的 UseCase
8. UI 层 (Presentation/Pages)
- 创建示例页面
UavLiveVideoPage - 实现镜头切换功能(PopupMenuButton)
- 实现加载状态显示
- 实现错误处理和重试机制
- 预留 RTC SDK 集成位置
9. 测试
- 编写单元测试
get_uav_video_stream_usecase_test.dart - 测试成功场景
- 测试失败场景
- 测试默认参数
10. 文档
- 创建集成指南
UAV_VIDEO_INTEGRATION_GUIDE.md - 创建使用示例
UAV_VIDEO_USAGE_EXAMPLES.md
📁 文件清单
新增文件(7个)
lib/features/v2/device_list/domain/entities/uav_video_stream_entity.dart- 实体类lib/features/v2/device_list/domain/usecases/get_uav_video_stream_usecase.dart- 用例lib/features/v2/device_list/presentation/pages/uav_live_video_page.dart- 示例页面test/features/v2/device_list/domain/usecases/get_uav_video_stream_usecase_test.dart- 单元测试docs/UAV_VIDEO_INTEGRATION_GUIDE.md- 集成指南docs/UAV_VIDEO_USAGE_EXAMPLES.md- 使用示例docs/UAV_VIDEO_COMPLETION_SUMMARY.md- 本文件
修改文件(9个)
lib/core/consts/http_api_consts.dart- 添加 API 常量lib/features/v2/device_list/data/datasources/drone_station_datasource.dart- 添加接口方法lib/features/v2/device_list/data/datasources/drone_station_datasource_impl.dart- 实现接口lib/features/v2/device_list/data/repositories/drone_station_repository_impl.dart- 实现仓库lib/features/v2/device_list/domain/repositories/drone_station_repository.dart- 添加仓库接口lib/features/v2/device_list/presentation/bloc/drone_station_event.dart- 添加事件lib/features/v2/device_list/presentation/bloc/drone_station_state.dart- 添加状态lib/features/v2/device_list/presentation/bloc/drone_station_bloc.dart- 添加事件处理lib/core/di/injection.dart- 注册依赖
核心特性
清洁架构设计
- 分层清晰:Entity → UseCase → Repository → DataSource → BLoC → UI
- 依赖倒置:高层模块不依赖低层模块的具体实现
- 可测试性:每层都可以独立测试
可扩展性
- 多镜头支持:通过枚举轻松扩展更多镜头类型
- 多清晰度支持:支持自适应、低、中、高四种清晰度
- 多 RTC SDK 支持:兼容火山引擎和声网两种 RTC SDK
- 可复用:可在任何页面中使用,无需重复实现
健壮性
- 错误处理:使用
Either<Failure, T>统一处理错误 - 默认值:提供合理的默认参数,简化调用
- 日志记录:详细的日志输出,方便调试
- 重试机制:支持手动重试和自动刷新
快速开始
方式一:直接使用示例页面
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => UavLiveVideoPage(
droneSn: '1581F8HGX253U00A063U',
cameraIndex: '176-0-0',
),
),
);
方式二:在自定义页面中集成
参考 docs/UAV_VIDEO_USAGE_EXAMPLES.md 中的详细示例。
📋 API 说明
请求参数
{
"sn": "1581F8HGX253U00A063U", // 必填:设备序列号
"lensType": "", // 可选:wide/zoom/ir
"cameraIndex": "176-0-0", // 必填:摄像头编号
"qualityType": "adaptive", // 可选:adaptive/low/medium/high
"videoExpire": 720000000 // 可选:Token有效期(毫秒)
}
返回数据
{
"msg": "操作成功",
"code": 200,
"data": {
"sn": "1581F8HGX253U00A063U",
"camera_index": "176-0-0",
"url": "app_id=xxx&room_id=xxx&token=xxx&user_id=xxx",
"expire_ts": 1781155234,
"url_type": "volc" // volc 或 agora
}
}
🔧 后续工作
-
集成 RTC SDK 显示实际视频画面
- 根据
urlType选择火山引擎或声网 SDK - 初始化 RTC 引擎并加入房间
- 渲染远程视频流
- 根据
-
添加视频录制功能
- 开始/停止录制
- 保存录制文件
-
添加截图功能
- 截取当前帧
- 保存到相册
-
优化视频加载超时处理
- 设置合理的超时时间
- 提供友好的超时提示
-
支持多路视频同时观看
- 分屏显示多个摄像头
- 切换主视图
📚 相关文档
✅ 验证结果
- 所有文件编译通过,无错误
- 单元测试编写完成
- 依赖注入配置正确
- 文档齐全
💡 注意事项
- 不要在页面上直接调用 API:必须通过 BLoC 管理状态
- 及时释放资源:在
dispose()中关闭 BLoC - 合理设置 Token 有效期:建议设置为较长的时间,避免频繁刷新
- 检查 RTC 参数:确保 AppId、RoomId、Token、UserId 正确解析
- 根据 urlType 选择 SDK:volc 使用火山引擎,agora 使用声网
🎉 总结
无人机实时视频接口已成功对接,采用清洁架构设计,具有良好的可扩展性和可维护性。所有代码已通过编译检查,单元测试覆盖主要场景,文档齐全。下一步只需集成 RTC SDK 即可显示实际视频画面。