HarmonyOS 鸿蒙Next ijkplayer xomponent 切换播放

HarmonyOS 鸿蒙Next ijkplayer xomponent 切换播放
<markdown _ngcontent-aop-c149="" class="markdownPreContainer">

@Prop @Watch(‘updateVideoSource’) videoSource: VideoSource | null = null;

使用第三方库ijkplayer播放rtsp流,这是官方项目的播放例子,目前实现了播放,现在我想要更新播放地址进行切换播放 使用[@Watch](/user/Watch)在更新数据源的时候重新调用play,但是不行,是否是要重新创建Xomponent.


import { PlayerListener } from './PlayerListener'
import { VideoPlayer } from './VideoPlayer'
import { VideoSource } from './VideoSource'

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 videoSource: VideoSource | null = null; private pic = $r(‘app.media.icon’); private xComponentContext: object | null = null; private player: VideoPlayer = new VideoPlayer(); private isInit: boolean = false; private xComponentId = “xid” + Math.random(); @State isPlaying: boolean = false;

build() { Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Auto, justifyContent: FlexAlign.Start }) { Stack() { XComponent({ id: this.videoSource?.title + this.xComponentId, type: ‘surface’, libraryname: ‘ijkplayer_napi’ }) .onLoad((context) => { if (context) { this.xComponentContext = context; } }) .onDestroy(() => {

      })
      .width(<span class="hljs-string"><span class="hljs-string">'100%'</span></span>)
      .height(<span class="hljs-string"><span class="hljs-string">'100%'</span></span>)
      .onClick(() =&gt; {
        <span class="hljs-keyword"><span class="hljs-keyword">this</span></span>.stop();
      })
    Image(<span class="hljs-keyword"><span class="hljs-keyword">this</span></span>.pic)
      .width(<span class="hljs-string"><span class="hljs-string">'100%'</span></span>)
      .height(<span class="hljs-string"><span class="hljs-string">'100%'</span></span>)
      .visibility(<span class="hljs-keyword"><span class="hljs-keyword">this</span></span>.isPlaying ? Visibility.None : Visibility.Visible)
      .onClick(() =&gt; {
        <span class="hljs-keyword"><span class="hljs-keyword">this</span></span>.play();
      })
    Image($r(<span class="hljs-string"><span class="hljs-string">'app.media.icon_replay'</span></span>))
      .width(<span class="hljs-number"><span class="hljs-number">45</span></span>).height(<span class="hljs-number"><span class="hljs-number">45</span></span>)
      .visibility(<span class="hljs-keyword"><span class="hljs-keyword">this</span></span>.isPlaying ? Visibility.None : Visibility.Visible)
      .onClick(() =&gt; {
        <span class="hljs-keyword"><span class="hljs-keyword">this</span></span>.play();
      })
  }.width(<span class="hljs-string"><span class="hljs-string">'100%'</span></span>).height(<span class="hljs-string"><span class="hljs-string">'100%'</span></span>)

  Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Start }) {
    Button($r(<span class="hljs-string"><span class="hljs-string">'app.string.Play'</span></span>))
      .onClick(() =&gt; {
        <span class="hljs-keyword"><span class="hljs-keyword">this</span></span>.play();
      })
      .width(<span class="hljs-string"><span class="hljs-string">'400px'</span></span>)
      .height(<span class="hljs-string"><span class="hljs-string">'80px'</span></span>)
      .margin(<span class="hljs-string"><span class="hljs-string">'15px'</span></span>)
    Button($r(<span class="hljs-string"><span class="hljs-string">'app.string.Pause'</span></span>))
      .onClick(() =&gt; {
        <span class="hljs-keyword"><span class="hljs-keyword">if</span></span>(<span class="hljs-keyword"><span class="hljs-keyword">this</span></span>.player != <span class="hljs-literal"><span class="hljs-literal">null</span></span>) {
          <span class="hljs-keyword"><span class="hljs-keyword">this</span></span>.player.pause()
        }
      })
      .width(<span class="hljs-string"><span class="hljs-string">'400px'</span></span>)
      .height(<span class="hljs-string"><span class="hljs-string">'80px'</span></span>)
      .margin(<span class="hljs-string"><span class="hljs-string">'15px'</span></span>)

    Button($r(<span class="hljs-string"><span class="hljs-string">'app.string.destroy'</span></span>))
      .onClick(() =&gt; {
        <span class="hljs-keyword"><span class="hljs-keyword">this</span></span>.release();
      })
      .width(<span class="hljs-string"><span class="hljs-string">'400px'</span></span>)
      .height(<span class="hljs-string"><span class="hljs-string">'80px'</span></span>)
      .margin(<span class="hljs-string"><span class="hljs-string">'15px'</span></span>)
  }
}

}

initPlayer(): void { 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 { if (!this.isInit || this.player == null) { this.isInit = true; this.initPlayer(); } this.isPlaying = true; this.player?.play(); }

stop(): void { if (this.player != null) { this.player.pause(); } this.isPlaying = false; }

release() { if(this.player != null) { this.player.stop(); this.player.release(); this.isInit = false; } } }


更多关于HarmonyOS 鸿蒙Next ijkplayer xomponent 切换播放的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复
[@Prop](/user/Prop)装饰变量时会进行深拷贝,在拷贝的过程中除了基本类型、Map、Set、Date、Array外,都会丢失类型。所以你这边prop修饰的videoSource的改动并不会让UI进行重新渲染,可以在[@watch](/user/watch)的回调方法updateVideoSource中重新创建Xomponent

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


针对您提到的HarmonyOS鸿蒙Next中ijkplayer组件切换播放的问题,这里提供一些可能的原因和解决方案的概述:

ijkplayer作为一款流行的开源视频播放器库,在HarmonyOS上使用时,切换播放功能可能会受到系统API兼容性、资源释放与重新加载效率以及组件状态管理等因素的影响。

  1. 检查API兼容性:确保ijkplayer的当前版本与HarmonyOS Next的API级别兼容。不兼容的API可能导致切换播放时出错。

  2. 资源管理:在切换播放前,确保前一个视频资源已正确释放,避免内存泄漏和资源占用。可以通过监听播放结束事件或手动调用释放资源的API来实现。

  3. 状态管理:优化ijkplayer组件的状态管理逻辑,确保在切换播放时,组件能够正确响应新的播放请求,并更新UI显示。

  4. 错误处理:增加错误处理逻辑,捕获切换播放过程中可能出现的异常,并给出用户友好的提示。

如果上述方法未能解决您的问题,可能是由于特定的系统或应用配置导致的。此时,建议直接联系HarmonyOS官方客服,以获取更具体的帮助。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部