在跨设备投屏场景中,如何通过 AVSession 管理远程控制指令(播放/暂停/快进)?

在跨设备投屏场景中,如何通过 ​AVSession​ 管理远程控制指令(播放/暂停/快进)?

HarmonyOS Next
9天前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
灵芸小骏

1. 创建并注册AVSession

会话初始化
在投屏端(如手机)创建AVSession,声明支持的媒体操作(播放/暂停/快进)

let avSession: avSession.AVSession = await avSession.createAVSession(context, 'video', 'MySession');
let cmds: avSession.AVControlCommandType[] = ['play', 'pause', 'seek'];
avSession.activate(); // 激活会话
  • 1.
  • 2.
  • 3.

状态同步

通过分布式数据管理框架,将会话ID及元数据同步至目标设备(如电视):

// 使用分布式Data同步会话信息
let distributedData: distributedData.DataShareHelper = ...;
distributedData.put('currentSessionId', avSession.sessionId);
  • 1.
  • 2.
  • 3.

2. 建立跨设备控制器

远程控制器绑定
在接收端(如电视)通过会话ID创建AVSessionController,并订阅控制指令

// 从分布式数据中获取会话ID
let sessionId: string = distributedData.get('currentSessionId');

// 创建控制器并绑定到远程会话
let controller: avSession.AVSessionController = await avSession.createController(sessionId);
controller.registerControlCommandCallback('play', (command: avSession.AVControlCommand) => {
  handleRemotePlayCommand(command);
});
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

3. 指令分发与处理

发送端(手机)处理本地操作
监听本地UI事件并更新会话状态:

// 用户点击播放按钮
buttonPlay.onClick(() => {
  avSession.setAVPlaybackState({ state: avSession.PlaybackState.PLAYING });
  controller.dispatchControlCommand({ command: 'play' });
});
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

接收端(电视)响应远程指令

通过控制器回调执行实际媒体操作:

function handleRemotePlayCommand(command: avSession.AVControlCommand) {
  mediaPlayer.play();
  // 更新本地播放状态并同步回源设备
  avSession.setAVPlaybackState({ state: avSession.PlaybackState.PLAYING });
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

4. 状态双向同步

播放进度同步
使用分布式对象(DistributedObject)实时同步播放进度:

// 发送端定期更新进度
setInterval(() => {
  let progress: number = mediaPlayer.getCurrentPosition();
  distributedObject.set('playbackProgress', progress);
}, 1000);

// 接收端监听进度变化
distributedObject.on('playbackProgress', (newVal: number) => {
  mediaPlayer.seekTo(newVal);
});
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

5. 异常处理

断网重连机制
监听网络状态变化并重建会话连接:

network.on('connectivityChange', (data: { state: 'connected' | 'disconnected' }) => {
  if (data.state === 'connected') {
    controller.reconnect(); // 重新绑定会话
  }
});
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
分享
微博
QQ
微信
回复
8天前


相关问题
HarmonyOS 设备支持范围
667浏览 • 1回复 待解决
如何、录
3059浏览 • 1回复 待解决
无线,不能创维电视了
8301浏览 • 1回复 待解决
HarmonyOS 功能如何使用?
1099浏览 • 1回复 待解决
HarmonyOS 如何真机
748浏览 • 1回复 待解决
怎么控制播放时不息?
6993浏览 • 1回复 待解决
HarmonyOS 有没有软件?
534浏览 • 1回复 待解决
屏幕作业区域控制视频快进或回退
1298浏览 • 1回复 待解决
dayu200开发板如何,或者
870浏览 • 0回复 待解决