ijkplayer使用案例,擺脫render.c

有人說我寫的都是水文,所以這篇這是毫無邏輯的水文

這里 提到過ijkplayer在Android可以通過surface來進(jìn)行自定義OpenGL渲染,其中的原理就是利用OpenGL的extension來獲取紋理

可惜的是像魅族這種機(jī)器,明明說支持GL_OES_EGL_image_external然后死活編譯不通過, 看來還是要通過手動(dòng)的方式來操作

在貼大段的代碼前先要搞明白狀況

  1. ijk在哪里回傳解碼數(shù)據(jù)
  2. 回傳過來的是i420, nv12, rbg565,rgba8888的哪一種
  3. JNI怎么交給Java,用什么類型打包

答日:

  1. ffplay.cvideo_image_display2方法, 參數(shù)中的overlay就包含我們想要pixcels

  2. 這個(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" },
  1. 回傳的話我這里采用笨辦法
  • 在FFplayer中添加void * 指向我們的Interface;
  • 在video_image_display2中執(zhí)行interface方法
  • 使用byte[]打包數(shù)據(jù)并附帶width,height等重要信息

接下來就可以貼代碼了

  1. Java層配置
player.native_setDisplayInterface(this);
        player.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "overlay-format", "fcc-i420");

native_setDisplayInterface是自定義添加回調(diào)的方法

  1. 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;
}
  1. 最后在 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對(duì)象。這個(gè)操作會(huì)引發(fā)虛擬機(jī)頻繁GC。STW的過于頻繁會(huì)使應(yīng)用卡成狗,最后將指針強(qiáng)轉(zhuǎn)為long

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 這是一個(gè)跨平臺(tái)的播放器ijkplayer,iOS上集成看【如何快速的開發(fā)一個(gè)完整的iOS直播app】(原理篇)。 ...
    FindCrt閱讀 7,113評(píng)論 2 46
  • 隨著互聯(lián)網(wǎng)技術(shù)的飛速發(fā)展,移動(dòng)端播放視頻的需求如日中天,由此也催生了一批開源/閉源的播放器,但是無論這個(gè)播放器功能...
    金山視頻云閱讀 46,420評(píng)論 28 170
  • 教程一:視頻截圖(Tutorial 01: Making Screencaps) 首先我們需要了解視頻文件的一些基...
    90后的思維閱讀 4,744評(píng)論 0 3
  • afinalAfinal是一個(gè)android的ioc,orm框架 https://github.com/yangf...
    passiontim閱讀 15,489評(píng)論 2 45
  • 2016年9月4日 臨走前一晚和我媽馬路邊擼串,隔壁桌小哥從他老婆做飯不好吃吃完飯從不洗碗吐槽到賺錢少還愛花最...
    少年像風(fēng)閱讀 619評(píng)論 0 50