ijkplayer 播放器状态解析

播放器 ijkplayer 内存在不同的状态。通过 API 调用实现状态的条状。

下图绘制了播放器中所有的状态,以及主要的涉及状态跳转的 API 调用。

状态转换图

图中实线箭头连接的状态变化通过 API 调用完成,

虚线箭头连接的状态变化是通过 播放器内部执行完特定任务或者发生错误 而自动发生的状态变化。

音视频---ijkplayer 播放器状态解析_C++

状态释义

状态名

播放器表现

idle

闲置状态,刚完成构造的 FijkPlayer 处于此状态。此状态下播放器占用少量内存,无额外线程启动。idle 状态只能通过 setDataSource 转换为 initialized 状态

initialized

初始化完成状态,和 idle 状态相比,仅是多了输入媒体数据源的信息。 同样无额外线程打开。

asyncPreparing

异步准备状态,在 initialized 状态调用 prepareAsync 到达此状态。 这不是一个稳定状态,此状态等特定任务完成后自动转化为 prepared 状态。 这一状态的主要准备工作是 探测媒体文件类型,打开媒体文件,打开解码器以及新建解码线程,新建数据 read 线程,打开音频输出设备,新建视频输出线程等。

prepared

asyncPreparing 完成指定任务后自动转化为此状态。此状态下已经缓冲并解码了一部分音视频数据,可以随时进行播放。

started

媒体(视频、音频)正在播放中。

paused

媒体(视频、音频)播放暂停。

completed

媒体(视频、音频)播放完成。 可重新从头开始播放。

stopped

播放器各种线程占用资源都已经释放。 音频设备关闭。

end

播放器中所有需要手动释放的内存都释放完成。处于此状态的播放器只能等待垃圾回收进行内存释放。

error

播放器出现错误。

可播放状态

prepared、 started、 paused、 completed。

可播放状态中可以通过调用 start 转化为 started 状态,并且进行媒体播放。

稳定状态

idle、 initialized、 prepared、 paused、 completed、 stopped、 end、error。

稳定状态只可以通过 API 调用转换为其他的状态,不会自主发生状态变化。

非稳定状态

asyncPreparing、 started。

非稳定状态会在一定条件下自动转变为其他状态,也可以通过 API 调用进行状态跳转。

完整转换 API

idle

API名称

目标状态

setDataSource()

initialized

reset()

idle

release()

end

initialized

API名称

目标状态

prepareAsync()

asyncPreparing

reset()

idle

release()

end

asyncPreparing

API名称

目标状态

处理完成

prepared

出现错误

error

reset()

idle

release()

end

prepared

API名称

目标状态

seekTo()

prepared

start()

started

reset()

idle

release()

end

started

API名称

目标状态

seekTo()

started

start()

started

pause()

paused

stop()

stopped

播放完成

completed

出现错误

error

reset()

idle

release()

end

paused

API名称

目标状态

seekTo()

paused

start()

started

pause()

paused

stop()

stopped

reset()

idle

release()

end

completed

API名称

目标状态

seekTo()

paused

start()

started (从头开始)

pause()

paused

stop()

stopped

reset()

idle

release()

end

stopped

API名称

目标状态

stop()

stopped

prepareAsync()

asyncPreparing

reset()

idle

release()

end

error

API名称

目标状态

reset()

idle

release()

end

end

API名称

目标状态

release()

end


音视频---ijkplayer 播放器状态解析_音视频_02