ijkplayer的基础是基于FFmpeg的ffplay.c进行改造和扩展,中间层进行安卓和iOS的自适应,安卓需要增加JNI接口,iOS可以直接调用c/c。 IJK作为一个优秀的开源跨平台播放器,拥有完整的状态机,播放时机清晰。
目录
一. ijkplayer时序图
二. ijkplayer状态图
1、状态机
2、状态分析
3、状态转移
另一方面,ijkplayer的时间图以iOS移动端的播放定时为例,从IJKMoviePlayerViewController.m到IJKFFMoviePlayerController.m,中间层为ijkplayer
二. ijkplayer状态图1、状态机ijkplayer的状态为idle、initialized、async_preparing、prepared、started、paused、stopped、completed
原始状态为idle,然后在set_datasource之后进入initialized,再在prepare_async之后进入async_preparing的异步初始化; 由于初始化错误跳转到error,初始化完成后进入prepared,立即进入started,播放失败进入error后,用户单击暂停进入paused,用户单击继续播放时进入started 播放过程中,播放结束后进入paused,紧跟着stopped; 播放完成后状态变为completed,然后进入stopped或从头返回started; 在stopped时,可以重新初始化async_preparing; 最终error和stopped都执行结束。
另外,可以在end以外的state中调用reset,可以在任意的state中调用release。
2、状态分析各状态分析如下表所示。
状态值状态说明idle0空闲initialized1播放器async_preparing2的异步初始化、探测格式和分析媒体流prepared3的初始化已完成。 started4开始播放paused5并暂停播放,单击start则继续播放completed6并停止播放。 可以从开头开始再生stopped7并停止再生,可以再次初始化error8的再生错误,在preparing中或playing中end9结束再生,释放资源3、状态转移(1) idle转移
//ijk MP _ set _ data _ source-MP _ state _ initialized//ijk MP _ reset-self//ijk MP _ release-MP _ staaase
//ijk MP _ prepare _ async-MP _ state _ async _ preparing//ijk MP _ reset-MP _ state _ idle//ijk MP _ reeadle
//preparing-MP _ state _ prepared//preparing-MP _ state _ error//ijk MP _ reset-MP _ state _ idle /
//ijk MP _ seek _ to-self//ijk MP _ start-MP _ state _ started//ijk MP _ reset-MP _ state _ idle//ijk MP /
//ijk MP _ seek _ to-self//ijk MP _ start-self//ijk MP _ state _ paused//ijk MP _ stop-MP _ pause ijkMP_release-MP_state_end(6) paying-MP _ release-MP _ state _ end (6) payi
//ijk MP _ seek _ to-self//ijk MP _ start-MP _ state _ started//ijk MP _ pause-self//ijk MP _ stop-MP
//ijk MP _ seek _ to-self//ijk MP _ start-MP _ state _ started//ijk MP _ pause-self//ijk MP _ stop-MP
//ijk MP _ stop-self//ijk MP _ prepare _ async-MP _ state _ async _ preparing//ijk MP _ reset-MP _ statatttate
//ijk MP _ reset-MP _ state _ idle//ijk MP _ release-MP _ state _ end