鸿蒙分布式投屏

鸿蒙AVSession Kit------ ArkTS 与 C/C++ 双语言、Provider 与 Controller 全角 - 掘金

适用:API 12+ / ArkTS & C++ / 手机→智慧屏、耳机、车机等任意分布式设备


一、投播全景图

flowchart LR A["手机播放器"] -->|"AVSession\nsetAVMetadata/State"| M["本地会话"] M -->|"AVCastPicker.show()"| P["投播面板"] P -->|"用户选择设备"| D["远端设备\n智慧屏/耳机/车机"] D -->|"AVSessionController"| R["远端播放器"] M -.->|"投播生命周期事件"| A

二、核心概念 1 张表

概念 作用 备注 AVCastPicker 系统 UI,列出可投设备 一行代码唤起 AVCastController 跨设备会话控制器 与本地 AVSessionController 同族 CastState 枚举:IDLE / CONNECTING / CONNECTED / DISCONNECTING 监听投播链路状态 CastPlayback 投播过程中的播放状态 仍通过本地 AVSession 同步


三、ArkTS 最小落地(4 步 8 行)

  1. 准备本地会话(与本地播放完全一致)
ts 复制代码
const session = await avSession.createAVSession(getContext(), 'MusicCast', 'audio');
await session.setAVMetadata({...});
await session.setAVPlaybackState({...});
await session.activate();
  1. 唤起投播面板
ts 复制代码
import { avCast } from '@kit.AVSessionKit';
const picker = new avCast.AVCastPicker();
picker.show(session.sessionId);          // ① 一行弹出设备列表
  1. 监听投播状态
ts 复制代码
session.on('castStateChange', (state: avCast.CastState) => {
  console.info('投播状态', state);       // ② 连接/断开/失败
});
  1. 远端控制
ts 复制代码
const castCtrl = await session.createCastController(); // ③ 拿到跨设备控制器
await castCtrl.sendControlCommand({ command: 'pause' });

四、C/C++ NDK 最小落地

cpp 复制代码
// 1. 创建本地会话
OH_AVSession* session;
OH_AVSession_Create("CastDemo", SESSION_TYPE_AUDIO,
                    "com.demo", "MainAbility", &session);

// 2. 唤起投播面板
OH_AVCastPicker_Show(session);

// 3. 监听状态
OH_AVSession_RegisterCastStateCallback(session,
  [](OH_AVSession*, CastState state, void*){ /* 处理 */ }, nullptr);

// 4. 远端控制
OH_AVCastController* castCtrl;
OH_AVCastController_Create(session, &castCtrl);
OH_AVControllerCommand cmd = { .command = COMMAND_PAUSE };
OH_AVCastController_SendCommand(castCtrl, &cmd);

五、投播生命周期事件

事件 触发时机 建议动作 castStateChange 连接/断开/失败 切换 UI(本地 ↔ 远端) castPlaybackStateChange 远端播放状态变化 同步进度条 castOutputDeviceChange 可用设备列表变化 刷新投播面板

注册示例(ArkTS)

ts 复制代码
session.on('castPlaybackStateChange', (state) => updateProgress(state.position));
session.on('castOutputDeviceChange',   (list) => refreshPicker(list));

六、后台投播 checklist

  • 本地会话已激活并设置元数据
  • 申请了 AUDIO_PLAYBACK 长时任务(投播期间仍在后台播放)
  • 监听 castStateChange,在 DISCONNECTED 时切回本地播放器
  • 远端设备断开后主动 release() CastController 避免泄漏

七、一句话总结

"把本地 AVSession 搭好,加一行 AVCastPicker.show(),其余全部复用现有播放逻辑。"

相关推荐
夜雨声烦丿41 分钟前
Flutter 框架跨平台鸿蒙开发 - 打造带账单分摊功能的记账本,支持多人AA与智能结算
flutter·华为·harmonyos
南村群童欺我老无力.1 小时前
Flutter 框架跨平台鸿蒙开发 - 打造时钟、番茄钟、倒计时三合一应用
flutter·华为·typescript·harmonyos
菜鸟小芯1 小时前
【开源鸿蒙跨平台开发先锋训练营】DAY 3 Flutter集成Dio网络请求,本地美食数据清单列表功能开发
flutter·harmonyos·美食
奋斗的小青年!!1 小时前
Flutter适配OpenHarmony富文本RichText组件实践
flutter·harmonyos·鸿蒙
奋斗的小青年!!10 小时前
Flutter跨平台开发鸿蒙应用实战:OA系统考勤打卡组件深度解析
flutter·harmonyos·鸿蒙
全栈开发圈10 小时前
新书速览|鸿蒙之光HarmonyOS 6应用开发入门
华为·harmonyos
儿歌八万首13 小时前
鸿蒙 ArkUI 实战:沉浸式状态栏的 3 种实现方案
华为·harmonyos
大雷神13 小时前
HarmonyOS中考试模板开发教程
华为·harmonyos
全栈开发圈13 小时前
干货分享|鸿蒙6开发实战指南
人工智能·harmonyos·鸿蒙·鸿蒙系统
鸣弦artha13 小时前
Flutter框架跨平台鸿蒙开发 —— Image Widget 基础:图片加载方式
flutter·华为·harmonyos