android linphone中opengl显示的实现

本文介绍了一种通过Java与C代码交互的方式实现在Android平台上进行视频渲染的技术方案。具体包括在Java层创建GL2JNIView并监听surface事件,通过LinphoneManager与C层通信,以及在C层处理视频帧数据并通过调用Java层的方法触发OpenGL ES的视频帧刷新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1,java层

在界面中创建GL2JNIView(基类为GLSurfaceView)。

 

创建对象AndroidVideoWindowImpl,将GL2JNIView作为参数传入构造函数。在该对象中监听GL2JNIView的surface事件(mVideoRenderingView.getHolder().addCallback)。

 

当surface变化时(如显示窗口大小变化、activity被其他程序遮住),此时触发回调函数:

public void surfaceChanged(SurfaceHolderholder, intformat,

                    int width, int height)

在该函数中调用LinphoneManager.getLc().setVideoWindow(vw); 将AndroidVideoWindowImpl对象传到c代码层

C代码中对应的函数在mediastreamer2\src\android\android-opengl-display.c中android_display_set_window,

此函数中调用步骤如下:

(1)      (*jenv)->CallVoidMethod(jenv,window,ad->set_opengles_display_id,ptr);

其中window为java传过来的AndroidVideoWindowImpl对象;ad->set_opengles_display_id为java 类AndroidVideoWindowImpl成员函数setOpenGLESDisplay;ptr为结构体变量opengles_display,该结构体存储yuv数据,在后面每帧显示时会用到。

(2)      将AndroidVideoWindowImpl赋值给ad->android_video_window

 

该函数主要完成java和c互换对象指针。这主要是由于opengl刷新每帧视频必须由java层的onDrawFrame来完成,而linphone的视频流在c层接收解码,需要由c函数来触发刷新。

 

 

2,c代码层

在android-opengl-display.c的每帧处理函数android_display_process中,

调用(*jenv)->CallVoidMethod(jenv,ad->android_video_window,ad->request_render_id);其中ad->android_video_window为setVideoWindow传过来的AndroidVideoWindowImpl对象;ad->request_render_id为java类AndroidVideoWindowImpl成员函数requestRender

该函数触发opengl刷新一帧,在java层会调用onDrawFrame。

 

在onDrawFrame函数中调用c代码层的render,参数为第(1)中传到java层的opengles_display结构体。

C代码层对应代码在mediastreamer2\src\utils\opengles_display.c中ogl_display_render函数,在此函数中将opengles_display中yuv数据绘制到opengl surface中。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值