ijkplayer播放器架构从原型到升级_播放器架构图-程序员宅基地

技术标签: ijkplayer源码分析  音视频开发  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、模糊、九宫格等;歌词解析与显示

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u011686167/article/details/121440104

智能推荐

Linux电源管理(11)_Runtime PM之功能描述_rpm的child_count-程序员宅基地

文章浏览阅读827次。转自:http://www.wowotech.net/pm_subsystem/rpm_overview.html1. Runtime PM的软件框架 RPM的代码在“drivers/base/power/runtime.c”中,软件框架如下: device driver(或者driver所在的bus、class等)需要提供3个回调函数,runtime_suspend、_rpm的child_count

用jQuery的clone()方法拷贝元素_jquery element clone-程序员宅基地

文章浏览阅读9.7k次。Clone an Element Using jQuery除了移动元素,你还可以拷贝元素。简单理解:移动元素就是剪切,拷贝元素就是复制。jQuery的clone()方法可以拷贝元素。比如,如果我想把target2从left-well拷贝到right-well,我们可以这样写:$("#target2").clone().appendTo("#right-well");你有没有发现两个jQuery方法..._jquery element clone

枚举 注解_编写一个person类,使用override注解它的tostring方法-程序员宅基地

文章浏览阅读157次。10.1 枚举类的使用 主要内容:  如何自定义枚举类  如何使用关键字enum定义枚举类  Enum类的主要方法  实现接口的枚举类10.1.1 枚举类的使用:入门  类的对象只有有限个,确定的。举例如下:  星期:Monday(星期一)、......、Sunday(星期天)  性别:Man(男)、Woman(女)  季节:Spring(春节)......Winter(冬天)  支付方式:Cash(现金)、WeChatPay(微信)、Alipay(_编写一个person类,使用override注解它的tostring方法

传统蓝牙RFCOMM协议概念介绍-Bluetooth rfcomm-程序员宅基地

文章浏览阅读9.2k次,点赞3次,收藏17次。零. 概述本文章主要讲下蓝牙RFCOMM协议(bluetooth rfcomm)的概念以及在整个蓝牙协议栈中的起的作用一. 声明本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下:第一篇:蓝牙综合介绍 ,主要介绍蓝牙的一些概念,产生背景,发展轨迹,市面蓝牙介绍,以及蓝牙开发板介绍。第二篇:Transport层介绍,主要介绍蓝牙协议栈跟蓝牙芯片之前的硬件传输协议,比如基于UART的H4,H5,BCSP,基于USB的H2等第三篇:传统蓝牙controller介绍,主要介绍传_rfcomm

python 删除特定列_pandas删除某一列的方法(drop函数)-程序员宅基地

文章浏览阅读6w次,点赞7次,收藏53次。呆瓜半小时入门python数据分析(博主录制)方法一:直接del df['column-name']删除sub_grade_列,输入del df['sub_grade_x']方法二:采用drop方法,有下面三种等价的表达式:1. df= df.drop('column_name', 1)输入:df,drop('num',axix=1),不改变内存,及输入df的时候,它还是显示原数据2. df.d..._pandas drop列

最牛逼的java代码_分享史上java最牛逼,最简短的代码-程序员宅基地

文章浏览阅读1.7k次。确实是12306的最核心代码呀alert("当前访问用户过多,请稍后重试!");确实牛public class Test{static{System.out.println("hello world!");System.exit(0);}}这代码style逆袭了public class ZuiNiu{public static void main(String[] args){System.out..._java好用的代码

随便推点

itertools-程序员宅基地

文章浏览阅读49次。1. 组合数取出数组中的组合数import itertoolsprint list(itertools.combinations([1, 2, 3, 4, 5], 2))>>> [(1, 2), (1, 3), (1, 4), (1, 5), (2, 3), (2, 4), (2, 5), (3, 4), (3, 5), (4, 5)]

cannot import name ‘compare_ssim‘ from ‘skimage.measure‘_cannot import name 'compare_ssim' from 'skimage.me-程序员宅基地

文章浏览阅读1.8w次,点赞30次,收藏44次。1.将from skimage.measure import compare_ssim替换成 from skimage import measure2.将compare_ssim()替换成measure.compare_ssim()_cannot import name 'compare_ssim' from 'skimage.measure

MyBaits学习-3_@mapper 取别名-程序员宅基地

文章浏览阅读151次。MyBatus学习-3再经过MyBatis的Helloworld程序学习,我们知道Mapper的配置文件就是MyBatis的核心,也是他的魅力所在,魔法之源,至尊奥义。接下来我们先去补全我们的增删改查操作,在EmployeeMappper接口中添加剩下的三个方法: public boolean addEmp(Employee employee); public void upd..._@mapper 取别名

matlab如何用二分法求函数零点,如何用二分法求函数的“零点”的近似值-程序员宅基地

文章浏览阅读2.6k次。什么是二分法?定义:对于区间 【a , b】上连续的,且 f ( a ) - f ( b ) < 0="" 的函数="" y="f" (="" x="" )="" ,通过不断地把函数="" f="" (="" x="" )="">怎么用二分法求函数的零点的近似值?用二分法求函数零点的近似值步骤如下:第一步:确定区间 【a , b】,验证:f(a)·f(b)<0,给定精确度;第二步:求区..._二分法求函数零点matlab

Oracle10g RAC在线更换OCR votedisk-程序员宅基地

文章浏览阅读123次。操作之前确认集群状态都正常1、替换OCR# ./ocrconfig -replace ocrmirror /dev/rhdisk11# ./ocrcheckStatus of Oracle Cluster Registry is as follows : Version : 2 Total s..._oracle 10g rac替换ocr

颜色识别_csdn颜色识别-程序员宅基地

文章浏览阅读456次。【OpenCV】颜色识别实例(瓶盖) 原创 ..._csdn颜色识别

推荐文章

热门文章

相关标签