HarmonyOS 鸿蒙Next ijkplayer rtsp流 多组件播放
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
当前提供的信息未能复现问题,无法定位,能提供一下完整的最小可复现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