Android 播放器渲染一帧图像

本文想要介绍ijkplayer 软硬解下是如何渲染一帧图像到屏幕上。


先简单的介绍一下MediaCodec API,不过 需要好好研究学习一番,它涉及解码播放的方方面面。下面的2个图能给我们清晰的认识。


MediaCodec 在API level 16 configure Surface 后解码播放的过程中运用的MediaCodec 接口
数据输入接口:

获取解码后的数据:

视频渲染:


ijkplayer 音视频渲染引擎是在ijksdl库实现的,它包含的东西较多:
  • OpenSL ES 音频
  • AudioTrack / jni 音频
  • OpenGL ES 渲染视频
  • NativeWindow / 渲染视频
  • MediaCodec / jni 硬件解码器
  • MediaCodecDummy 虚拟硬件解码器
  • pthread 线程API / 线程同步封装

备注1:ijkyuv库其实是 libyuv 用于各种YUV/RGB格式直接转换。远比FFmpeg 中的 libswscale 提供的效率高。
备注2:MediaCodecDummy 虚拟硬件解码器在Android 播放器音视频同步机制 说明。


硬解渲染过程

  • 解码 入队列
    函数 amc_fill_frame
    解码线程中 video_thread(ff_video_dec)调用函数drain_output_buffer 获取解码后的信息后调用函数
    static int amc_fill_frame( IJKFF_Pipenode *node, AVFrame *frame, int *got_frame, int output_buffer_index, int acodec_serial, SDL_AMediaCodecBufferInfo *buffer_info)
    填充了当前帧的基本数据,PTS、width、height、以及 MediaCodec dequeueOutputBuffer 返回索引值 等等,这里的 AVFrame* frame 并没有申请解码后数据的缓冲区。
    最后调用queue_picture 把填充好的AVFrame数据 入队列。
  • 出队列渲染 video_refresh_thread(ff_vout) 视频渲染线程(音视频同步)调用SDL_VoutDisplayYUVOverlay 然后调用SDL_VoutOverlayAMediaCodec_releaseFrame_l最终直接调用[releaseOutputBuffer](https://developer.android.com/reference/android/media/MediaCodec.html#releaseOutputBuffer(int, boolean))(int index, boolean render) 视频渲染

软解

  • 解码入队列
  • 出队列渲染 video_refresh_thread(ff_vout) 视频渲染线程(音视频同步)调用SDL_VoutDisplayYUVOverlay 然后调用 func_display_overlay_l 然后根据配置选择ANativeWindow / OpenGL ES

1、ANativeWindow Copy机制
备注:ANativeWindow 也可以直接支持YUV(HAL_PIXEL_FORMAT_YV12)格式的copy 的。渲染线程调用SDL_Android_NativeWindow_display_l 渲染步骤:

  • ANativeWindow_setBuffersGeometry
  • ANativeWindow_lock
  • ANativeWindow_unlockAndPost

2、OpenGL ES
渲染线程调用 IJK_EGL_display

  • IJK_GLES2_Renderer_renderOverlay
  • func_uploadTexture
  • glDrawArrays
  • eglSwapBuffers

备注:OpenGL ES shader 实现了yuv 到rgb 转换 效率更高

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 教程一:视频截图(Tutorial 01: Making Screencaps) 首先我们需要了解视频文件的一些基...
    90后的思维阅读 10,256评论 0 3
  • 随着互联网技术的飞速发展,移动端播放视频的需求如日中天,由此也催生了一批开源/闭源的播放器,但是无论这个播放器功能...
    金山视频云阅读 46,672评论 28 170
  • 本篇文章是基于谷歌有关Graphic的一篇概览文章的翻译:http://source.android.com/de...
    lee_3do阅读 11,978评论 2 21
  • 关于企业的办事效率 今天出门,发现阳光正好,微风不燥。嗯~是个找领导反映情况的好日子。到了办公室,找到正“...
    Mr_oOo阅读 1,222评论 0 1
  • 已经记不得是去年还是前年,我和表妹悄悄取了邻居家的花苗来。认真的栽种,浇水。偶尔也对它们说说悄悄话。因为有了想要...
    细雨扉扉阅读 3,283评论 5 3