ijkplayer的时序与状态图分析

2024-06-15 10:38

本文主要是介绍ijkplayer的时序与状态图分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

ijkplayer底层基于FFmpeg的ffplay.c进行改造与扩展,中间层进行Android与iOS的适配,Android需要添加JNI接口,而iOS可以直接调用c/c++。IJK作为一款优秀的开源跨平台播放器,具备完整的状态机,而且播放时序清晰。

目录

一、ijkplayer时序图

二、ijkplayer状态图

1、状态机

2、状态分析

3、状态迁移

一、ijkplayer时序图

以iOS移动端的播放时序为例,从IJKMoviePlayerViewController.m,到IJKFFMoviePlayerController.m,中间层是ijkplayer_ios.m,再到ijkplayer.c,最后是ff_ffplay.c。具体时序如下图所示:

二、ijkplayer状态图

1、状态机

ijkplayer的状态包括:idle、initialized、async_preparing、prepared、started、paused、stopped、completed、error、end共10种state。整体的状态机state machine如下:

原始状态是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。

需要特别说明的是,除了end可以在其他state调用reset,可以在任意state调用release。

2、状态分析

每个状态分析如下表所示:

状态状态值状态描述
idle0空闲状态
initialized1创建播放器
async_preparing2异步初始化、探测格式与分析媒体流
prepared3初始化完成
started4开始播放
paused5暂停播放,点击start可恢复播放
completed6完成播放,可从头开始播放
stopped7停止播放,可重新初始化
error8播放出错,preparing或playing过程中
end9结束播放,释放资源

3、状态迁移

(1) idle迁移

 // ijkmp_set_data_source    -> MP_STATE_INITIALIZED//// ijkmp_reset              -> self// ijkmp_release            -> MP_STATE_END

(2) initialized迁移

// ijkmp_prepare_async      -> MP_STATE_ASYNC_PREPARING
//
// ijkmp_reset              -> MP_STATE_IDLE
// ijkmp_release            -> MP_STATE_END

(3) async_preparing迁移

 // preparing                -> MP_STATE_PREPARED// preparing                -> MP_STATE_ERROR//// ijkmp_reset              -> MP_STATE_IDLE// ijkmp_release            -> MP_STATE_END

(4) prepared迁移

 // ijkmp_seek_to            -> self// ijkmp_start              -> MP_STATE_STARTED//// ijkmp_reset              -> MP_STATE_IDLE// ijkmp_release            -> MP_STATE_END

(5) started迁移

 // ijkmp_seek_to            -> self// ijkmp_start              -> self// ijkmp_pause              -> MP_STATE_PAUSED// ijkmp_stop               -> MP_STATE_STOPPED// playing                  -> MP_STATE_COMPLETED// playing                  -> MP_STATE_ERROR//// ijkmp_reset              -> MP_STATE_IDLE// ijkmp_release            -> MP_STATE_END

(6) paused迁移

 // ijkmp_seek_to            -> self// ijkmp_start              -> MP_STATE_STARTED// ijkmp_pause              -> self// ijkmp_stop               -> MP_STATE_STOPPED//// ijkmp_reset              -> MP_STATE_IDLE// ijkmp_release            -> MP_STATE_END

(7) completed迁移

 // ijkmp_seek_to            -> self// ijkmp_start              -> MP_STATE_STARTED// ijkmp_pause              -> self// ijkmp_stop               -> MP_STATE_STOPPED//// ijkmp_reset              -> MP_STATE_IDLE// ijkmp_release            -> MP_STATE_END

(8) stopped迁移

 // ijkmp_stop               -> self// ijkmp_prepare_async      -> MP_STATE_ASYNC_PREPARING//// ijkmp_reset              -> MP_STATE_IDLE// ijkmp_release            -> MP_STATE_END

(9) error迁移

 // ijkmp_reset              -> MP_STATE_IDLE// ijkmp_release            -> MP_STATE_END

这篇关于ijkplayer的时序与状态图分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1063215

相关文章

Go标准库常见错误分析和解决办法

《Go标准库常见错误分析和解决办法》Go语言的标准库为开发者提供了丰富且高效的工具,涵盖了从网络编程到文件操作等各个方面,然而,标准库虽好,使用不当却可能适得其反,正所谓工欲善其事,必先利其器,本文将... 目录1. 使用了错误的time.Duration2. time.After导致的内存泄漏3. jsO

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3

找不到Anaconda prompt终端的原因分析及解决方案

《找不到Anacondaprompt终端的原因分析及解决方案》因为anaconda还没有初始化,在安装anaconda的过程中,有一行是否要添加anaconda到菜单目录中,由于没有勾选,导致没有菜... 目录问题原因问http://www.chinasem.cn题解决安装了 Anaconda 却找不到 An

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

C++ 各种map特点对比分析

《C++各种map特点对比分析》文章比较了C++中不同类型的map(如std::map,std::unordered_map,std::multimap,std::unordered_multima... 目录特点比较C++ 示例代码 ​​​​​​代码解释特点比较1. std::map底层实现:基于红黑

Spring、Spring Boot、Spring Cloud 的区别与联系分析

《Spring、SpringBoot、SpringCloud的区别与联系分析》Spring、SpringBoot和SpringCloud是Java开发中常用的框架,分别针对企业级应用开发、快速开... 目录1. Spring 框架2. Spring Boot3. Spring Cloud总结1. Sprin

Spring 中 BeanFactoryPostProcessor 的作用和示例源码分析

《Spring中BeanFactoryPostProcessor的作用和示例源码分析》Spring的BeanFactoryPostProcessor是容器初始化的扩展接口,允许在Bean实例化前... 目录一、概览1. 核心定位2. 核心功能详解3. 关键特性二、Spring 内置的 BeanFactory

MyBatis-Plus中Service接口的lambdaUpdate用法及实例分析

《MyBatis-Plus中Service接口的lambdaUpdate用法及实例分析》本文将详细讲解MyBatis-Plus中的lambdaUpdate用法,并提供丰富的案例来帮助读者更好地理解和应... 目录深入探索MyBATis-Plus中Service接口的lambdaUpdate用法及示例案例背景

MyBatis-Plus中静态工具Db的多种用法及实例分析

《MyBatis-Plus中静态工具Db的多种用法及实例分析》本文将详细讲解MyBatis-Plus中静态工具Db的各种用法,并结合具体案例进行演示和说明,具有很好的参考价值,希望对大家有所帮助,如有... 目录MyBATis-Plus中静态工具Db的多种用法及实例案例背景使用静态工具Db进行数据库操作插入

Go使用pprof进行CPU,内存和阻塞情况分析

《Go使用pprof进行CPU,内存和阻塞情况分析》Go语言提供了强大的pprof工具,用于分析CPU、内存、Goroutine阻塞等性能问题,帮助开发者优化程序,提高运行效率,下面我们就来深入了解下... 目录1. pprof 介绍2. 快速上手:启用 pprof3. CPU Profiling:分析 C