要使用封装优化ijk就必须先了解ffmpeg,然后看ijk对ffmpeg的C层封装!
这是我看ijk源码时候的笔记,比较散乱。不喜勿喷~
ijk源码简析:
1.ijkplayer_jni.c 封装的播放器JNI层 API,对应java层调用。
2.ijkplayer.c 封装的播放器API,对应给JNI层调用
3.ff_ffplay_options.c 参数设置options
4.ijkplayer_android.c 创建播放器,对应Android系统的音视频
5..ff_ffplay.c ffmpeg主要封装类 含整个解码流程
首先入口是 JNI_OnLoad()加载.so库,各种初始化。RegisterNatives注册g_methods中的native方法,注册后,相当于java层声明为native方法的函数与c层有一个映射关系;举个栗子,当我们java里面调用_start()方法的时候,其实调用的是c层中的IjkMediaPlayer_start()方法;对应地,作者在java层声明了一个修饰java方法的annotation,这些函数也会在这里注册,实现后面在C层也能调用java层的函数。
接着还调用了几个init方法:
ffp_global_init() –>主要是ffmpeg的初始化工作, 前面说过ijkplayer是基于ffmpeg的。
FFmpegApi_global_init(env)–>初始化FFmpegApi#av_base64_encode函数。
后面调用的IjkMediaPlayer.native_profileBegin(“libijkplayer.so”);发现并没有什么作用的样子,注释了还是能成功运行。未解?
IjkMediaPlayer初始化过程:调用了native方法native_setup(new WeakReference(this));对应C语言的IjkMediaPlayer_native_setup()方法,也在ijkplayer_jni.c文件里面。
然后就是ijkmp_android_create(message_loop);/ijkplayer_android.c : 很重要
创建一个IJKMediaPlayer类型的player。
接下来就是对ijkplayer结构体中的ffplayer进行设置,