有人說我寫的都是水文状您,所以這篇這是毫無邏輯的水文
這里 提到過ijkplayer在Android可以通過surface來進(jìn)行自定義OpenGL渲染,其中的原理就是利用OpenGL的extension來獲取紋理
可惜的是像魅族這種機(jī)器颊乘,明明說支持GL_OES_EGL_image_external
然后死活編譯不通過, 看來還是要通過手動(dòng)的方式來操作
在貼大段的代碼前先要搞明白狀況
- ijk在哪里回傳解碼數(shù)據(jù)
- 回傳過來的是i420, nv12, rbg565,rgba8888的哪一種
- JNI怎么交給Java,用什么類型打包
答日:
在
ffplay.c
的video_image_display2
方法, 參數(shù)中的overlay
就包含我們想要pixcels這個(gè)格式可以通過options來配置, 具體在
ff_ffplay_options.h
的頭文件中
{ "fcc-_es2", "", 0, OPTION_CONST(SDL_FCC__GLES2), .unit = "overlay-format" },
{ "fcc-i420", "", 0, OPTION_CONST(SDL_FCC_I420), .unit = "overlay-format" },
{ "fcc-yv12", "", 0, OPTION_CONST(SDL_FCC_YV12), .unit = "overlay-format" },
{ "fcc-rv16", "", 0, OPTION_CONST(SDL_FCC_RV16), .unit = "overlay-format" },
{ "fcc-rv24", "", 0, OPTION_CONST(SDL_FCC_RV24), .unit = "overlay-format" },
{ "fcc-rv32", "", 0, OPTION_CONST(SDL_FCC_RV32), .unit = "overlay-format" },
{ "fcc-custom", "", 0, OPTION_CONST(SDL_FCC_CUSTOM), .unit = "overlay-format" },
- 回傳的話我這里采用笨辦法
- 在FFplayer中添加void * 指向我們的Interface;
- 在video_image_display2中執(zhí)行interface方法
- 使用byte[]打包數(shù)據(jù)并附帶width,height等重要信息
接下來就可以貼代碼了
- Java層配置
player.native_setDisplayInterface(this);
player.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "overlay-format", "fcc-i420");
native_setDisplayInterface
是自定義添加回調(diào)的方法
-
native_setDisplayInterface
具體實(shí)現(xiàn)
在ijkplayer_jni.c
中
void Java_tv_danmaku_ijk_media_player_IjkMediaPlayer_native_1setDisplayInterface(JNIEnv *env, jobject thiz, jobject displayListener)
{
MPTRACE("%s\n", __func__);
IjkMediaPlayer *mp = jni_get_media_player(env, thiz);
jobject saveListener = (*env)->NewGlobalRef(env, displayListener);
ijkmp_set_display_interface(mp, (void *)saveListener);
ijkmp_dec_ref_p(&mp);
}
FFplay是個(gè)前置聲明的struct在ijkplayer_jni.c
中的不能訪問的
ijkmp_set_display_interface
擴(kuò)展在ijkplayer.c
中
void ijkmp_set_display_interface(IjkMediaPlayer *mp, void *display)
{
mp->ffplayer->display_interface = display;
}
- 最后在
video_image_display2
中執(zhí)行display_interface
的Java方法順利yuv420P的具體數(shù)據(jù)這就不用經(jīng)過'render.c'和NativeWindow
了
最后小坑jclass
要手動(dòng)釋放···
3.18在數(shù)據(jù)回傳時(shí)不應(yīng)該使用java對象拍冠。這個(gè)操作會(huì)引發(fā)虛擬機(jī)頻繁GC。STW的過于頻繁會(huì)使應(yīng)用卡成狗火本,最后將指針強(qiáng)轉(zhuǎn)為long