【代码案例】HarmonyOS 鸿蒙Next 视频弹幕功能

发布于 1周前 作者 h691938207 最后一次编辑是 5天前 来自 鸿蒙OS

【代码案例】HarmonyOS 鸿蒙Next 视频弹幕功能

HarmonyOS Next应用开发案例(持续更新中……)

本案例完整代码,请访问:https://gitee.com/harmonyos-cases/cases/tree/master/CommonAppDevelopment/feature/danmakuplayer

介绍

本示例介绍如何使用[@ohos](/user/ohos).danmakuflamemaster[@ohos](/user/ohos).gsyvideoplayer开发支持视频弹幕的播放器。可以自定义弹幕样式、占据屏幕宽度,发送弹幕,开关弹幕视图。

效果图预览

使用说明

  1. 点击播放按钮,进行视频播放,弹幕自动开启
  2. 点击“弹幕关”按钮,关闭弹幕
  3. 点击“发送弹幕”按钮,发送一条弹幕,弹幕内容为“这是一条弹幕”+当前时间戳

实现思路

  1. 初始化播放器
    videoInit: (iVideoPlayer: IVideoPlayer, xid: string) => void = (iVideoPlayer: IVideoPlayer, xid: string) => {
      this.mIVideoPlayer = iVideoPlayer;
      this.xComponentId = xid;
      this.mIVideoPlayer.setUp(this.videoModel.getUrl(), this.videoModel.getCacheWithPlay());
    }
    <button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 4px; right: 8px; font-size: 14px;">复制</button>
  2. 初始化弹幕
    danmuInit() {
      let maxLinesPair: Map<number, number> = new Map();
      maxLinesPair.set(BaseDanmaku.TYPE_SCROLL_RL, 5); // 滚动弹幕最大显示5行
      // 设置是否禁止重叠
      let overlappingEnablePair: Map<number, boolean> = new Map();
      ...
      this.mContext = DanmakuContext.create();
      //设置弹幕样式
      this.mContext.setDanmakuStyle(DANMAKU_STYLE_STROKEN, 3)
     .setDuplicateMergingEnabled(false)
      ...
      if (this.model != null) {
     this.mParser = this.createParser();
     this.model.setCallback(new Call(that));
     // 设置弹幕点击事件监听
     this.model.setOnDanmakuClickListener(new OnDanMu(that));
     ...
      }
    }
    <button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 4px; right: 8px; font-size: 14px;">复制</button>
  3. 添加弹幕
/*
 * 使用BaseDanmaku类初始化弹幕实例,并设定一系列弹幕的参数值,包括弹幕内容、样式等
 * 添加到提前实例化的弹幕模型model对象上
 */
private addDanmaku(isLive: Boolean) {
  if (this.mContext) {
    let danmaku: BaseDanmaku = this.mContext.mDanmakuFactory.createDanmaku(BaseDanmaku.TYPE_SCROLL_RL);
    danmaku.text = "这是一条弹幕" + SystemClock.uptimeMillis();
    danmaku.padding = 5;
    danmaku.priority = 0; // 可能会被各种过滤器过滤并隐藏显示
    danmaku.isLive = isLive.valueOf();// 是否为在线弹幕
    danmaku.setTime(this.model.getCurrentTime() + 1200);
    if (this.mParser) {
      danmaku.textSize = 25 * (this.mParser.getDisplayer().getDensity() * 0.8);
    }
    danmaku.textColor = 0xffff0000;
    danmaku.textShadowColor = 0xffffffff;
    danmaku.borderColor = 0xff00ff00;
    this.model.addDanmaku(danmaku);
  }
}
<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 4px; right: 8px; font-size: 14px;">复制</button>
  1. 解析弹幕
/*
 * DanmakuParser类中包含了对弹幕数据的解析方法,解析每条弹幕的开始/结束时间、样式、内容等
 */
private createParser(): BaseDanmakuParser {
  let parser: BaseDanmakuParser = new DanmukuParser();
  let jsonSource = new JSONSource(sourceData);
  parser.load(jsonSource);
  return parser;
}
<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 4px; right: 8px; font-size: 14px;">复制</button>
  1. 本地自定义弹幕数据文件,格式如下
    {
      "DanmakuType":4,
      "alphaDuration":0,
      "beginAlpha":0,
      "beginX":0,
      "beginY":0,
      "duration":0,
      "endAlpha":0,
      "endX":0,
      "endY":0,
      "index":1,
      "isQuadraticEaseOut":false,
      "rotationY":0,
      "rotationZ":0,
      "text":"hhhhhhhhh",
      "textColor":-9946501,
      "textShadowColor":-16777216,
      "textSize":25,
      "time":219370,
      "timeOffset":0,
      "translationDuration":0,
      "translationStartDelay":0
    }
    <button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 4px; right: 8px; font-size: 14px;">复制</button>
  2. 创建video的播放、初始化以及暂停事件的emitter,在对应事件开启监听
    let videoPlayEvent: emitter.InnerEvent = {
      eventId: 1
    };
    let videoInitEvent: emitter.InnerEvent = {
      eventId: 2
    };
    let videoPauseEvent: emitter.InnerEvent = {
      eventId: 3
    };
    <button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 4px; right: 8px; font-size: 14px;">复制</button>

高性能知识点

不涉及

工程结构&模块类型

danmakuplayer                          // har类型
|---/src/main/ets/model                        
|   |---DanmakuData.ets                // 数据模型层-列表数据模型 
|   |---DanmakuParser.ets              // 数据模型层-列表项数据模型
|---/src/main/ets/view                        
|   |---VideoView.ets                  // 视图层-场景列表页面
<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 4px; right: 8px; font-size: 14px;">复制</button>

模块依赖

[@ohos](/user/ohos)/routermodule(动态路由)

参考资料

  1. 本实例依赖danmakuflameplayer弹幕三方库
  2. 本实例依赖GSYVideoPlayer视频播放器库
2 回复
 动态更改 setMaximumLines 不生效

针对您提出的【代码案例】HarmonyOS 鸿蒙Next 视频弹幕功能,以下提供相关信息:

HarmonyOS Next支持通过@ohos.danmakuflamemaster和@ohos.gsyvideoplayer开发具备视频弹幕功能的播放器。开发者可以自定义弹幕样式、设置弹幕占据的屏幕宽度,并实现发送弹幕及开关弹幕视图的功能。

在实现过程中,首先需要初始化视频播放器和弹幕组件,设置弹幕的样式、最大显示行数、是否禁止重叠等参数。随后,通过创建弹幕解析器来解析弹幕数据,包括弹幕的开始/结束时间、样式、内容等。在添加弹幕时,可以设定弹幕的内容、样式、是否为在线弹幕等属性,并将其添加到弹幕模型中。

此外,为了提升性能,建议采用GPU硬件加速进行弹幕的绘制,以降低CPU的负载。

如果您在开发过程中遇到具体问题,可以参考HarmonyOS的官方文档或开发者社区的相关讨论。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部