ijkplayer系列2:ijkplayer java层面源码分析

00. Java入口类IjkMediaPlayer

IMediaPlayer定义了所有MediaPlayer相关的公共方法和常量,要了解ijkplayer能为我们做些什么事,主要看这个接口的方法。接口中没有提供注释,而是在其实现类IjkMediaPlayer中提供了注释信息,下面我们就着这些注释信息以及实践中得到的一些结论了解下ijkplayer究竟都能做些什么事情。
IjkMediaPlayer实现了IMediaPlayer的所有方法,并且和Native的交互都在这里处理。我们使用ijkplayer来开发项目,一般来说只需要使用到该类。

构造函数

IjkMediaPlayer提供了两个构造函数,分别如下:

IjkMediaPlayer()
IjkMediaPlayer(IjkLibLoader libLoader)

第二个构造函数的参数表示本地库的加载器,如非特殊情况我们都使用默认的,也就是传null或者直接使用第一个构造函数。

设置显示控件(Surface)

即设置视频sink(输出目标),ijkPlayer提供了两个方法,分别如下:

setDisplay(SurfaceHolder sh)
setSurface(Surface surface)

当只需要音频输出时,不要调用这两个方法。
另外,如果使用setSurface()设置sink,则调用setScreenOnWhilePlaying()没有效果,该方法的作用是使得播放时屏幕常亮,SurfaceHolder有提供屏幕常亮的方法,而Surface没有。如果使用了setSurface()方法,那么屏幕常亮的逻辑就要由外部自己处理。

设置数据源(Data Source)

ijkPlayer支持多种数据源,所有设置数据源的方法都是setDataSource(),通过参数类型来区分数据源,所有setDataSource的重载方法如下:

// 从content provider中获取数据
setDataSource(Context context, Uri uri)
setDataSource(Context context, Uri uri, Map headers)

// 从文件描述符中获取数据
setDataSource(FileDescriptor fd)

// 从file(本地文件)、http、rtsp、rtmp服务器中获取数据
setDataSource(String path)
setDataSource(String path, Map headers)

// 自定义数据源
setDataSource(IMediaDataSource mediaDataSource)
显然,如果我们使用rtmp协议做流媒体开发时使用的是第三类方法。相信大家都注意到了,一些方法里面会有个headers参数,这些参数我们后续再另外讨论。

设置屏幕常亮

使用setScreenOnWhilePlaying(boolean screenOn)方法实现,仅当设置sink时使用setDisplay()方法生效,常亮功能在播放时生效。

01.简易类图(只把一些重要的类标记出来)

ijkplayer系列2:ijkplayer java层面源码分析_第1张图片
说明:
ijkplayer 集成了三种播放器实现:
AndroidMediaPlayer:即安卓系统自带的播放器 MediaPlayer,基于 MediaCodec、AudioTrack 等安卓系统 API.
IjkExoMediaPlayer:即谷歌新推出的 ExoPlayer,同样是基于 MediaCodec、AudioTrack 等安卓系统 API,但相比 MediaPlayer 具有支持 DASH、高级 HLS、自定义扩展等优点。
IjkMediaPlayer:基于 FFmpeg 的 ffplay,集成了 MediaCodec 硬解码器、Opengl 渲染方式等。

一般而言, ijkplayer 就是指 IjkMediaPlayer,本文分析的对象就是 IjkMediaPlayer.
对 Android 而言,音频输出支持 AudioTrack、OpenSL ES 方式;视频输出支持 NativeWindow、OpenGL ES 方式。

  • IJK中提供了多个播放器的实现,包括IJK、系统mediaplayer、exoplayer
  • IJK看源码,还是得深入C语言层面去看,多数都是C语言,java层代码量很少,核心方法都是调用的navtive方法
  • MediaInfo。
  • IjkTrackInfo。
  • Surface。
  • SurfaceHolder。


参考资料

ijkplayer项目结构

ijkplayer 源码分析(上)
https://yhaolpz.github.io/ijkplayer-%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90/

ijkplayer框架深入剖析
https://www.jianshu.com/p/daf0a61cc1e0

ijkplayer 学习笔记
https://yhaolpz.github.io/ijkplayer-%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/

ijkplayer中遇到的问题汇总

ijkplayer中遇到的问题汇总
https://www.jianshu.com/p/496257563f69

关于Android用Ijkplayer拉流的视频比例问题
https://www.jianshu.com/p/542e8e8c4770

IJKPlayer问题集锦之不定时更新
https://www.jianshu.com/p/220b00d00deb

ijkplayer中遇到的问题汇总
https://juejin.im/post/5bc7e689f265da0adc18fb7a

Android MediaPlayer:getDuration()在prepare()后返回0
http://cn.voidcc.com/question/p-xwtgrfpw-xt.html

IjkPlayer播放器秒开优化以及常用Option设置
https://www.jianshu.com/p/843c86a9e9ad

ijk seek不准,会回跳的问题

https://blog.csdn.net/weixin_33894640/article/details/94117716

此方案确实可行

你可能感兴趣的:(播放器)