You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tizen平台支持移动操控的Avplayer控制器代码咨询

Tizen平台AVPlayer控制器实现方案

以下实现基于Tizen官方原生webapis.avplayAPI开发,控制逻辑、交互规则完全对齐安卓版本实现,支持客户端移动端操作触发全量播放器控制能力。

基础环境要求

  • Tizen Studio 4.0及以上版本
  • 最低适配Tizen 4.0系统(覆盖绝大多数在售三星智能电视设备)
  • 不需要引入第三方播放器依赖,直接调用系统原生API即可,性能表现和系统自带播放器一致

核心代码实现

1. 播放器初始化与状态监听

let avPlayer = null;
let playerState = 'IDLE';
let controlHideTimer = null;
let isProgressDragging = false;

// 初始化播放器
const initPlayer = (videoSource) => {
  // 先销毁已有实例避免资源泄漏
  if (avPlayer) {
    avPlayer.stop();
    avPlayer.close();
    avPlayer = null;
  }
  avPlayer = webapis.avplay.AvPlayManager.getAvPlay();
  
  // 注册播放器状态监听
  avPlayer.setListener({
    oncurrentplaytime: (currentTime) => {
      // 非拖动状态下同步进度条UI
      if (!isProgressDragging) updateProgressUI(currentTime);
    },
    onstreamcompleted: () => {
      playerState = 'COMPLETED';
      handlePlayFinish();
    },
    onerror: (errCode) => {
      console.error('播放器运行异常,错误码:', errCode);
      showPlayerToast('播放出错,请重试');
    },
    onplaybackstatechanged: (state) => {
      playerState = state;
      // 同步播放/暂停按钮状态
      syncPlayBtnState(state);
    },
    ondrmevent: () => {} // 加密视频可在此扩展DRM处理逻辑
  });

  // 加载视频源
  avPlayer.open(videoSource, { BufferOption: 'DEFAULT' });
  avPlayer.prepareAsync(() => {
    const totalDuration = avPlayer.getDuration();
    setTotalDurationUI(totalDuration);
    avPlayer.play();
  }, (err) => {
    console.error('视频加载失败:', err);
    showPlayerToast('视频加载失败');
  });
};

2. 移动端操作对应控制方法

所有方法直接和移动端控制层UI的事件绑定,交互反馈和安卓版本完全一致:

  • 播放/暂停切换
const togglePlayStatus = () => {
  if (playerState === 'PLAYING') {
    avPlayer.pause();
  } else if (playerState === 'PAUSED' || playerState === 'READY') {
    avPlayer.play();
  }
  resetControlHideTimer();
};
  • 进度拖动跳转
let seekDebounceTimer = null;
const handleProgressSeek = (targetTime) => {
  isProgressDragging = true;
  if (seekDebounceTimer) clearTimeout(seekDebounceTimer);
  // 300ms防抖,避免拖动时频繁调用seek接口造成卡顿
  seekDebounceTimer = setTimeout(() => {
    const safeTime = Math.max(0, Math.min(avPlayer.getDuration(), targetTime));
    avPlayer.seekTo(safeTime, () => {
      isProgressDragging = false;
    }, () => {
      isProgressDragging = false;
      showPlayerToast('进度跳转失败');
    });
  }, 300);
  resetControlHideTimer();
};
  • 固定步长快进/快退(和安卓端一致默认15秒步长,适配双击快进/快退操作)
const stepSeek = (direction) => {
  const current = avPlayer.getCurrentTime();
  const total = avPlayer.getDuration();
  const step = 15000;
  const target = direction === 'forward' ? current + step : current - step;
  handleProgressSeek(Math.max(0, Math.min(total, target)));
};
  • 音量调节(0-100区间,和安卓端取值范围一致)
const adjustVolume = (targetVolume) => {
  const safeVol = Math.max(0, Math.min(100, targetVolume));
  webapis.tvaudio.setVolume(safeVol);
  updateVolumeUI(safeVol);
  resetControlHideTimer();
};

3. 交互对齐注意事项

控制栏自动隐藏逻辑和安卓版本完全对齐:用户触发任意操作后重置计时器,3秒无操作自动隐藏控制层,播放状态下隐藏后不显示任何遮挡元素

  • 所有控制方法调用前必须判断当前播放器状态,禁止在IDLE/PREPARING状态下调用播放、seek等接口,避免触发系统级崩溃
  • 退出播放页面时必须手动调用avPlayer.stop()、avPlayer.close()方法释放解码器资源,否则会出现退出页面后音频继续播放的异常
  • 时间格式化、进度条计算、音量UI更新逻辑直接复用安卓端的规则,避免两端显示效果不一致
  • 触屏事件、遥控器按键事件统一映射到上述控制方法,保证不同操作入口的反馈完全一致

内容的提问来源于stack exchange,提问作者New developer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 14:57:21