【ijkplayer】介绍

0x1 系统架构

ijkplayer是由b站开源的播放器项目,底层基于ffmpeg, 支持Android和iOS。下面我们来简单介绍一下Android上的实现。
Android上的系统架构图如下。

下面分别对各个模块进行介绍:

0x11 ijkplayer-example

app的实现,主要是ui逻辑的实现,包括activity的实现,ui控件的组织,窗口的定制,数据的存储。

0x12 ijkplayer-example

通过调用ijkmediaplayer,android mediaplayer, google exoplayer这三种mediaplayer来实现媒体播放。

0x13 ijkplayer-java

对底层实现的ijkmediaplayer和android mediaplayer的java封装,对ijkmediaplayer的封装是通过调用底层jni对应的java接口,对android mediaplayer的封装是调用android系统实现的默认mediaplayer接口。

0x14 ijkplayer-exo

是对google exoplayer的封装,除了android默认的播放器之外,ExoPlayer是Google提供的在android平台上的另外一种播放器。

0x15 libijkplayer

提供了ijkmediaplayer的jni实现ijkplayer_jni.c,然后调用封装过的ffplayer.c, 再调用底层实现的解码库libijkffmpeg和显示库libijksdl。

0x16 libijkffmpeg

实现了媒体文件的demux, decode等功能。

0x17 libijksdl

实现对解码后的数据进行显示。

0x2 Java层关键模块分析

0x21 三种不同的mediaplayer实现.

这三种mediaplayer的类图如下图所示。

0x211 AndroidMediaPlayer

对Andoid默认播放器的封装。

0x212 IjkMediaPlayer

基于ffmpeg的播放器实现。

0x213 IjkExoMediaPlayer

基于Goodle开源的ExoPlayer的封装。

0x22 设置不同的Render

不同Render的类图如下图所示。

0x221 SurfaceRenderView

基于SurfaceView的显示实现。

0x222 TextureRenderView

基于TextureView的显示实现。

上述两种显示实现方式都实现了接口IRenderView

0x23 IjkMediaPlayer的JNI接口

详细的JNI接口如下图所示。

这些JNI接口提供了播放器的基本接口,包括播放准备(_setDataSource, _setVideoSurface, setVolume,_prepareAsync), 播放控制(_start, _stop, seekTo,_release, _reset)等功能。

0x3 关键流程

0x31 设置surface

设置surface的流程图如下图所示。

从上面的流程图可知,通过接口_setVideoSurface(), 把UI层的Surface对象(可以理解为显示窗口)设置给SDL显示对象,作为其显示窗口(native_window), 这样SDL有需要显示的内容可以直接在这个显示窗口上显示输出即可。

0x32 显示流程

显示的流程图如下图所示。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SPCuRnnj-1667355270414)(https://cdn.jsdelivr.net/gh/xzMhehe/StaticFile_CDN/static/code202211021012528.png)]

下面对上面的流程图简单说明。

解码线程ffp_video_thread解码完成以后,调用接口queue_picture把需要显示的buffer往SDL模块发送。

然后调用func_fill_frame()填充显示buffer, 这个时候需要判断是通过ffmpeg还是mediacodec实现的解码。

如果是ffmpeg实现的话则调用ijksdl_vout_overlay_ffmpeg.c中的函数func_fill_frame()。

否则调用ijksdl_vout_overlay_android_mediacodec.c中的func_fill_frame()。

然后显示线程video_refresh_thread就可以开始显示了。如果是GPU支持的格式则调用GPU进行输出,这个时候调用的

IJK_EGL_display,否则调用ANativeWindow_lock和ANativeWindow_unlockAndPost进行输出。

【ijkplayer】介绍相关推荐

  1. ijkplayer系列1:ijkplayer介绍

    ijkplayer简介 基于FFmpeg的轻量级Android/iOS视频播放器 https://github.com/Bilibili/ijkplayer 导入方式 gradle导入 allproj ...

  2. 几款优秀的点播、RTSP/RTMP直播播放器介绍

    1.ijkplayer 项目地址: https://github.com/Bilibili/ijkplayer 介绍:Ijkplayer 是Bilibili发布的基于 FFplay 的轻量级 Andr ...

  3. ijkplayer系列14:从入门到进阶问题树梳理

    ijkplayer系列14:从入门到进阶问题树梳理 基础准备 语法基础: C语言以及JNI开发是必备的能力 C语言语法简单复习 https://anacz.blog.csdn.net/article/ ...

  4. ijk基于exo_github上十二款最著名的Android播放器开源项目

    1.ijkplayer 介绍:Ijkplayer 是Bilibili发布的基于 FFplay 的轻量级 Android/iOS 视频播放器.实现了跨平台功能,API 易于集成:编译配置可裁剪,方便控制 ...

  5. github上十二款最著名的Android播放器开源项目

    1.ijkplayer 项目地址: https://github.com/Bilibili/ijkplayer 介绍:Ijkplayer 是Bilibili发布的基于 FFplay 的轻量级 Andr ...

  6. android 音乐视频播放器(github上十二款最著名的Android播放器开源项目)

    1.ijkplayer 项目地址: https://github.com/Bilibili/ijkplayer 介绍:Ijkplayer 是Bilibili发布的基于 FFplay 的轻量级 Andr ...

  7. 记一次Android视频播放器开发

    播放器入门 看小电影多年 当年甚至还是用QTplayer:而李开复,已经从技术员,技术总监,HR,出书,风投,隐退的华丽转身 而我们还只是个"程序员" 这么多年过去了,好像还真没认 ...

  8. AndroidVideoCache研究

    AndroidVideoCache研究 01.AndroidVideoCache + ijk 我们想让ijk支持边下边播的能力,通过AndroidVideoCache就可以实现,AndroidVide ...

  9. android 著名播放器,【精华】十二大最著名的Android播放器开源项目

    1.ExoPlayer https://github.com/google/ExoPlayer ExpPlayer是一个开源的,App等级的媒体API,它的开源项目包含了library和示例: Dem ...

  10. 16.1-视频播放器

    概述 一.在Android中,我们有三种方式来实现视频的播放: 1.使用其自带的播放器.指定Action为ACTION_VIEW,Data为Uri,Type为其MIME类型. 2.使用VideoVie ...

最新文章

  1. CTO 写的低级 Bug 再致网站被黑,CEO 的号都被盗了!
  2. Windows下MySQL安装
  3. 若依 v4.6.1 后台 排除log4j
  4. 3、MySQL优化数据库结构的3种方法
  5. why CRMFSH01 failed to return any value for my case
  6. 程序代码初学者_初学者:如何使用热键在Windows中启动任何程序
  7. mysql 以 db 结尾_MySQL的高级部分
  8. [html] 你有使用过ins标签吗?说说它的用途
  9. Codeforces Round #518 (Div. 2): D. Array Without Local Maximums(DP)
  10. 技术和商业的碰撞,谈阿里云与天猫双11这十年
  11. 保护眼睛——设置WIN7和XP 窗体、Chrome、IE网页背景颜色
  12. xp系统搭建iscsi服务器,配置Microsoft Windows XP对MDS/IPS-8的iSCSI主机
  13. 计算机无法用u盘重装系统,最简单不用U盘电脑重装系统教程
  14. 前端基础知识总结---HTML篇
  15. 暗刺,高并发五个利器
  16. K8S学习之污点容忍
  17. 在直播软件搭建中,如何基于rtmp实现视频直播?
  18. Git 报错:The ECDSA host key for gitlab.xx.net has changed, and the key for the corresponding.......
  19. 成都java培训好习惯的养成
  20. 一些经常送福利的技术公众号

热门文章

  1. LuaStudio破解版闪退解决方案
  2. android studio lua插件,android Studio 配置LUA 开发环境
  3. PyTorch入门 — — autograd(一)
  4. MultipartFile的transferTo方法
  5. win2003修改ntp服务器,win2003设置ntp服务器配置
  6. Linux C 链表(新建节点、添加节点)
  7. Warning FailedScheduling 30s (x2 over 108s) default-scheduler 0/3 nodes are available
  8. pytorch 错误 ImportError numpy.core.multiarray failed to import
  9. 自制操作系统Antz(13) 显示图片
  10. python财务案例分析考试答案_《财务案例分析》作业及答案(三次)