ijkplayer播放器架构从原型到升级

2024-06-15 10:38

本文主要是介绍ijkplayer播放器架构从原型到升级,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

ijkplayer是一款跨平台的播放器,支持Android与iOS端,核心部分基于ffmpeg,支持Android的mediacodec硬解与iOS的videotoolbox硬解,视频图像采用OpenGL进行渲染。许多主流播放器都使用ijkplayer作为播放方案。接下来我们从核心播放流程、内核架构、时序图、状态机、播放器整体架构进行详细分析。

目录

1、核心播放流程

2、播放内核架构

3、播放时序图

4、播放状态机

5、播放器整体架构


1、核心播放流程

ijkplayer的核心处理在ff_ffplay.c,从ffp_prepare_sync_l方法开始,调用stream_open方法分别创建video、audio、subtitle三个packet队列和三个frame队列,启动video_refresh_thread与read_thread线程。

其中read_thread为解封装线程,调用avformat_open_input打开本地文件/网络流,而stream_component_open方法负责初始化解码器、创建解码线程,接着是for循环读取媒体数据包存入packet队列。解码线程负责从packet队列取出数据包进行解码,然后存入frame队列。视频渲染线程默认10ms轮训一次,从frame队列取出图像进行渲染;iOS的音频播放采用AudioQueue,内部创建工作线程定时读取pcm数据进行播放:

2、播放内核架构

解封装、解码、播放分为三个线程,使用packet_queue队列连接解封装与解码,使用frame_queue连接解码与播放。其中解封装协议包括:http、https、hls、file、private自定义私有协议等,解封装格式包括:mp4、mkv、flv、mp3、m4a等;iOS视频硬解码用videotoolbox,Android视频硬解码用mediacodec;视频播放使用OpenGL渲染,iOS的音频播放用AudioQueue,Android音频播放用AudioTrack或OpenSL。如同如下图所示:


​​​​​​​

 

3、播放时序图

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

4、播放状态机

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

每个状态名、状态值、状态描述,如下图所示:

 

5、播放器整体架构

播放器的整体架构分为内核层、抽象层、控制层、业务层。

内核层负责核心播放功能,Android端可以用ExoPlayer、IjkPlayer、MediaPlayer,而iOS端可以用IjkPlayer、AVPlayer,也可以自研播放器。

抽象层负责对内核进行封装、内核切换,提供PlayerFactory来创建对应播放器。

控制层分为基本操作、界面控制、播放状态。基本操作包括play、pause、seek等,界面控制包括volume、brightness等,播放状态包括prepared、complete、error等。

业务层分为业务场景、特色功能、延伸能力。业务场景包括悬浮窗播放、边下边播、转音频播放、列表播放等,特色功能包括截图、视频剪裁、视频转GIF图、音频均衡器等,延伸能力包括投屏播放、技术埋点、插屏广告等。

 

 我们先从ijkplayer的核心播放流程进行分析,然后到内核播放架构、播放时序图、播放状态机,最后拓展到通用的播放器整体架构。希望能让大家对播放器有更深刻的认识。

学习音视频可以到GitHub:GitHub - xufuji456/FFmpegAndroid: android端基于FFmpeg实现音频剪切、拼接、转码、编解码;视频剪切、水印、截图、转码、编解码、转Gif动图;音视频合成与分离,配音;音视频解码、同步与播放;FFmpeg本地推流、H264与RTMP实时推流直播;FFmpeg滤镜:素描、色彩平衡、hue、lut、模糊、九宫格等;歌词解析与显示

这篇关于ijkplayer播放器架构从原型到升级的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

将Mybatis升级为Mybatis-Plus的详细过程

《将Mybatis升级为Mybatis-Plus的详细过程》本文详细介绍了在若依管理系统(v3.8.8)中将MyBatis升级为MyBatis-Plus的过程,旨在提升开发效率,通过本文,开发者可实现... 目录说明流程增加依赖修改配置文件注释掉MyBATisConfig里面的Bean代码生成使用IDEA生

Java异常架构Exception(异常)详解

《Java异常架构Exception(异常)详解》:本文主要介绍Java异常架构Exception(异常),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. Exception 类的概述Exception的分类2. 受检异常(Checked Exception)

C#原型模式之如何通过克隆对象来优化创建过程

《C#原型模式之如何通过克隆对象来优化创建过程》原型模式是一种创建型设计模式,通过克隆现有对象来创建新对象,避免重复的创建成本和复杂的初始化过程,它适用于对象创建过程复杂、需要大量相似对象或避免重复初... 目录什么是原型模式?原型模式的工作原理C#中如何实现原型模式?1. 定义原型接口2. 实现原型接口3

linux环境openssl、openssh升级流程

《linux环境openssl、openssh升级流程》该文章详细介绍了在Ubuntu22.04系统上升级OpenSSL和OpenSSH的方法,首先,升级OpenSSL的步骤包括下载最新版本、安装编译... 目录一.升级openssl1.官网下载最新版openssl2.安装编译环境3.下载后解压安装4.备份

MySQL 缓存机制与架构解析(最新推荐)

《MySQL缓存机制与架构解析(最新推荐)》本文详细介绍了MySQL的缓存机制和整体架构,包括一级缓存(InnoDBBufferPool)和二级缓存(QueryCache),文章还探讨了SQL... 目录一、mysql缓存机制概述二、MySQL整体架构三、SQL查询执行全流程四、MySQL 8.0为何移除查

微服务架构之使用RabbitMQ进行异步处理方式

《微服务架构之使用RabbitMQ进行异步处理方式》本文介绍了RabbitMQ的基本概念、异步调用处理逻辑、RabbitMQ的基本使用方法以及在SpringBoot项目中使用RabbitMQ解决高并发... 目录一.什么是RabbitMQ?二.异步调用处理逻辑:三.RabbitMQ的基本使用1.安装2.架构

怎么关闭Ubuntu无人值守升级? Ubuntu禁止自动更新的技巧

《怎么关闭Ubuntu无人值守升级?Ubuntu禁止自动更新的技巧》UbuntuLinux系统禁止自动更新的时候,提示“无人值守升级在关机期间,请不要关闭计算机进程”,该怎么解决这个问题?详细请看... 本教程教你如何处理无人值守的升级,即 Ubuntu linux 的自动系统更新。来源:https://

你的华为手机升级了吗? 鸿蒙NEXT多连推5.0.123版本变化颇多

《你的华为手机升级了吗?鸿蒙NEXT多连推5.0.123版本变化颇多》现在的手机系统更新可不仅仅是修修补补那么简单了,华为手机的鸿蒙系统最近可是动作频频,给用户们带来了不少惊喜... 为了让用户的使用体验变得很好,华为手机不仅发布了一系列给力的新机,还在操作系统方面进行了疯狂的发力。尤其是近期,不仅鸿蒙O

mybatis的整体架构

mybatis的整体架构分为三层: 1.基础支持层 该层包括:数据源模块、事务管理模块、缓存模块、Binding模块、反射模块、类型转换模块、日志模块、资源加载模块、解析器模块 2.核心处理层 该层包括:配置解析、参数映射、SQL解析、SQL执行、结果集映射、插件 3.接口层 该层包括:SqlSession 基础支持层 该层保护mybatis的基础模块,它们为核心处理层提供了良好的支撑。

百度/小米/滴滴/京东,中台架构比较

小米中台建设实践 01 小米的三大中台建设:业务+数据+技术 业务中台--从业务说起 在中台建设中,需要规范化的服务接口、一致整合化的数据、容器化的技术组件以及弹性的基础设施。并结合业务情况,判定是否真的需要中台。 小米参考了业界优秀的案例包括移动中台、数据中台、业务中台、技术中台等,再结合其业务发展历程及业务现状,整理了中台架构的核心方法论,一是企业如何共享服务,二是如何为业务提供便利。