HarmonyOS 鸿蒙Next ijkplayer rtsp流 多组件播放

发布于 1周前 作者 gougou168 来自 鸿蒙OS

HarmonyOS 鸿蒙Next ijkplayer rtsp流 多组件播放 使用第三方ijkplayer播放rtsp流,应用中会有多个播放的组件Commonvideoview,使用foreach管理,每一个组件是一个单独的mediaplayer实例,我在进行轮询(即切换数据源,个数不确定)的时候会崩溃,使用软解一段时间后直接闪退,并且发热严重,而且使用硬解的话高概率会整个平板卡死,重启平板才能解决

import { PlayerListener } from './PlayerListener'
import { VideoPlayer } from './VideoPlayer'
import { VideoSource } from './VideoSource'
import { unifiedDataChannel } from '@kit.ArkData';
import FontConstants from '../../common/constants/FontConstants';
import PaddingConstants from '../../common/constants/PaddingConstants';

class PlayerListenerClass implements PlayerListener{
  onPlay(): void {
  }

  onStop(): void {
  }

  onPause(): void {
  }

  onError(): void {
  }

  onUpdate(current: number, duration: number): void {
  }

  onComplete(): void {
  }
}

@Component
export struct CommonVideoView {
  private readonly TAG = "CommonVideoView";
  @Prop videoSource: VideoSource | null = null;
  private xComponentContext: object | null = null;
  private player: VideoPlayer = new VideoPlayer();
  private isInit: boolean = false;
  @State  xComponentId: string = "xid" + Math.random();
  @State isPlaying: boolean = false;
  @State isXComponentVisible: boolean = true;  // 新的状态,用于控制XComponent的可见性
  private videoUrl: string = "";

  build() {
      Stack({alignContent: Alignment.TopStart}) {
        if (this.isXComponentVisible) {

          XComponent({
          id: this.videoSource?.title + this.xComponentId,
          type: 'surface',
          libraryname: 'ijkplayer_napi'
        })
          .onLoad((context) => {
            if (context) {
              this.xComponentContext = context;
            }
            console.log(this.TAG, "onLoad");
            setTimeout(() => {
              this.play()
            }, 300)
            this.videoUrl = this.videoSource?.videoUrl ?? ''
          })
          .onDestroy(() => {
            console.log(this.TAG, "onDestroy");
          })
          .width('100%')
          .height('100%')
          }
        Text(this.videoSource?.title)
          .fontColor(Color.White)
          .fontSize(FontConstants.FONT_SIZE_12)
          .margin(PaddingConstants.PADDING_4)

      }.width('100%').height('100%')

  }

  initPlayer(): void {
    console.log(this.TAG, "initPlayer");
    this.release()
    this.player = new VideoPlayer();
    let listener = new PlayerListenerClass();
    this.player.setContext(this.xComponentContext!, this.videoSource?.title + this.xComponentId)
      .setVideoSource(this.videoSource!)
      .setListener(listener);
  }

  play(): void {
    console.log(this.TAG, "play111");
    console.log(this.TAG, "isInit " + this.isInit, 'player ' + this.player);
    if (!this.isInit || this.player == null) {
      this.isInit = true;
      this.initPlayer();
    }
    this.isPlaying = true;
    this.player?.play();
  }

  stop(): void {
    console.log(this.TAG, "stop");
    if (this.player != null) {
      this.player.pause();
    }
    this.isPlaying = false;
  }

  release() {
    console.log(this.TAG, "release");
    if(this.player != null) {
      this.player.stop();
      this.player.release();
      this.isInit = false;
    }
  }
}

更多关于HarmonyOS 鸿蒙Next ijkplayer rtsp流 多组件播放的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

当前提供的信息未能复现问题,无法定位,能提供一下完整的最小可复现demo吗?可以放在gitlab上,把地址贴过来

更多关于HarmonyOS 鸿蒙Next ijkplayer rtsp流 多组件播放的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


开发者您好,该问题已反馈研发人员进一步分析,请耐心等待!

针对帖子标题“HarmonyOS 鸿蒙Next ijkplayer rtsp流 多组件播放”的问题,以下回答专注于鸿蒙系统本身及其相关特性,不涉及Java或C语言内容:

在HarmonyOS鸿蒙系统中实现ijkplayer对RTSP流的多组件播放,主要依赖于鸿蒙系统的组件化架构和媒体播放框架。ijkplayer作为一个轻量级的跨平台视频播放器,理论上可以在鸿蒙系统中通过适配实现多组件播放功能。

要实现多组件播放,你需要确保ijkplayer已经正确移植到鸿蒙系统,并且能够处理RTSP流。接下来,你需要利用鸿蒙系统的Ability和Slice组件来构建你的播放界面。每个播放组件(如视频窗口)可以对应一个Slice,通过Ability进行管理和调度。

在播放控制上,你需要设计合理的逻辑来同步多个播放组件的状态,包括播放、暂停、停止等操作。此外,还需要考虑网络状态变化对RTSP流播放的影响,并做出相应的处理。

请注意,由于鸿蒙系统的不断更新和ijkplayer的适配情况,具体实现细节可能会有所不同。建议参考鸿蒙系统的官方文档和ijkplayer的最新版本,以确保兼容性和稳定性。

如果问题依旧没法解决请联系官网客服,官网地址是: https://www.itying.com/category-93-b0.html

回到顶部