HarmonyOS IJKPlayer是否支持变更XComponent组件渲染画面
IJKPlayer是否支持变更XComponent组件渲染画面
场景描述:现有一个XComponent组件A初始化IJKMediaPlayer之后,存在“全屏”或“切换至小窗”之类的逻辑是,创建了另一个XComponent组件B,能否将画面切换至组件B渲染?看到IJKPlayer中有setContext方法,尝试从组件B的onload方法之后获得context然后调用setContext方法,但是并没有成功。
DEMO:
import { IjkMediaPlayer} from '@ohos/ijkplayer';
@Entry
@Component
export struct ReportComponent {
mContext: object | undefined = undefined;
mIjkMediaPlayer = IjkMediaPlayer.getInstance();
progressMaxValue: number = 100;
mContext2: object | undefined = undefined;
build() {
Column(){
XComponent({
id: 'componentId1',
type: 'surface',
libraryname: 'ijkplayer_napi'
})
.onLoad((event?: object) => {
if (!!event) {
this.initPlay(event);
}
})
.onDestroy(() => {
})
.width('100%')
.aspectRatio(16/9.0)
Rect()
.height(60)
XComponent({
id: 'componentId2',
type: 'surface',
libraryname: 'ijkplayer_napi'
})
.onLoad((event?: object) => {
if (!!event) {
this.mContext2 = event
}
})
.onDestroy(() => {
})
.width('25%')
.aspectRatio(16/9.0)
Text("切换").padding({top:20,left:15})
.onClick(()=>{
this.mIjkMediaPlayer.setContext(this.mContext2)
})
}
}
private initPlay(context: object) {
this.mContext = context;
this.initPlayer()
}
initPlayer(){
//设置XComponent回调的context
if (!!this.mContext) {
this.mIjkMediaPlayer.setContext(this.mContext);
}
this.mIjkMediaPlayer.reset();
//设置debug模式
this.mIjkMediaPlayer.setDebug(true);
//初始化配置
this.mIjkMediaPlayer.native_setup();
//设置视频源
this.mIjkMediaPlayer.setDataSource("http://example/variant.m3u8");
//设置视频源http请求头
let headers = new Map([
["user_agent", "Mozilla/5.0 BiliDroid/7.30.0 (bbcallen@gmail.com)"],
["referer", "https://www.huawei.com"]
]);
this.mIjkMediaPlayer.setDataSourceHeader(headers);
//使用精确寻帧 例如,拖动播放后,会寻找最近的关键帧进行播放,很有可能关键帧的位置不是拖动后的位置,而是较前的位置.可以设置这个参数来解决问题
this.mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "enable-accurate-seek", "1");自动下载
//预读数据的缓冲区大小
this.mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "max-buffer-size", "102400");
//停止预读的最小帧数
this.mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "min-frames", "100");
//启动预加载
this.mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "start-on-prepared", "1");
// 设置无缓冲,这是播放器的缓冲区,有数据就播放
this.mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "packet-buffering", "0");
//跳帧处理,放CPU处理较慢时,进行跳帧处理,保证播放流程,画面和声音同步
this.mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "framedrop", "5");
// 最大缓冲cache是3s, 有时候网络波动,会突然在短时间内收到好几秒的数据
// 因此需要播放器丢包,才不会累积延时
// 这个和第三个参数packet-buffering无关。
this.mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "max_cached_duration", "3000");
// 无限制收流
this.mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "infbuf", "1");
this.mIjkMediaPlayer.setOptionLong(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "infbuf", "1")
// 屏幕常亮
this.mIjkMediaPlayer.setScreenOnWhilePlaying(true);
// 设置超时
this.mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "timeout", "10000000");
this.mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "connect_timeout", "10000000");
this.mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "addrinfo_timeout", "10000000");
this.mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "dns_cache_timeout", "10000000");
// 设置音量
// this.mIjkMediaPlayer.setVolume("0.5", "0.5");
// 变速播放
this.mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "soundtouch", "1");
this.mIjkMediaPlayer.setSpeed('1f');
this.mIjkMediaPlayer.setMessageListener();
this.mIjkMediaPlayer.prepareAsync();
this.mIjkMediaPlayer.start();
}
}
HarmonyOS
赞
收藏 0
回答 1
待解决
相关问题
Web组件是否支持离屏渲染
1762浏览 • 0回复 待解决
ijkplayer结合XComponent组件播放视频时根据视频尺寸和组件尺寸设置视频缩放模式
1881浏览 • 0回复 待解决
webview是否支持同层渲染
1767浏览 • 1回复 待解决
HarmonyOS如何通过XComponent(surface)组件的surfaceId自定义渲染(C++)
593浏览 • 2回复 待解决
目前是否支持在组件的链式声明中进行条件渲染
669浏览 • 1回复 待解决
opengl渲染矩形,如何实现opengl渲染,并用Xcomponent显示出来
924浏览 • 1回复 待解决
HarmonyOS是否支持在父组件onPageShow函数中通过执行某些操作可以触发子组件重新渲染
753浏览 • 1回复 待解决
HarmonyOS是否支持图表组件?
182浏览 • 1回复 待解决
HarmonyOS Native Drawing模块 文字渲染是否支持描边和阴影
264浏览 • 1回复 待解决
HarmonyOS监听组件参数变化,未变更问题
403浏览 • 1回复 待解决
HarmonyOS WebView默认使用GPU硬件渲染吗?使用的是OpenGL还是Vulkan? 是否支持软件渲染?
94浏览 • 1回复 待解决
HarmonyOS Image组件是否支持缓存?
179浏览 • 1回复 待解决
HarmonyOS web组件是否支持webrtc?
179浏览 • 1回复 待解决
HarmonyOS 动态渲染,组件形态能否实现动态渲染
266浏览 • 1回复 待解决
HarmonyOS ArkWeb组件是否支持深拷贝?
364浏览 • 2回复 待解决
HarmonyOS在使用XComponent做视频渲染,直接将yuv数据传给对应buffer后渲染视频不正常
556浏览 • 1回复 待解决
设置XComponent组件为透明
419浏览 • 1回复 待解决
开源三方库ijkplayer支持播放RTSP视频流吗?
3169浏览 • 2回复 待解决
HarmonyOS toggle组件是否支持完全受控
331浏览 • 0回复 待解决
HarmonyOS 相机预览画面会如何保持正常画面比例
443浏览 • 1回复 待解决
HarmonyOS中List组件是否支持局部刷新
420浏览 • 1回复 待解决
xComponent组件帧率怎么统计?
552浏览 • 1回复 待解决
XComponent组件如何设置背景颜色
2060浏览 • 1回复 待解决
Swiper是否支持组件复用
688浏览 • 1回复 待解决
这边使用如下方式是可以切换播放的,下面this.mIjkMediaPlayer.reset();就会导致切换时视频重新开始播放。
针对问题的回答:
1、当前不支持“转移播放”的功能,只能通过重新加载的方式切换。
2、已支持多播放器功能,可以尝试使用两个播放器解决当前切换的问题。
3、“播放进度也是从头开始”这个问题可以通过调用 seekTo 方法解决。