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

article/2025/8/24 18:44:34

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、模糊、九宫格等;歌词解析与显示


http://chatgpt.dhexx.cn/article/ybTGZTbp.shtml

相关文章

游戏手柄改typec接口

前言 几年前买的杂牌游戏手柄坏了好久,连接十分不稳定,稍微动一下线就会断连,我推断是线的质量不好,理论上将把线换掉应该就好了。一不做二不休,我想直接改成typec接口,手柄与数据线分离,这样就…

nl80211_iftype接口类型详解

NL80211_IFTYPE_UNSPECIFIED 上层协议未指定硬件接口类型,由驱动指定 NL80211_IFTYPE_ADHOC independent BSS member,各个无线主机之间对等交换数据 NL80211_IFTYPE_STATION managed BSS member NL80211_IFTYPE_AP 接入点,通常一端通过有…

android接口和type c对比,USB Type-C究竟比3.5mm音频接口好在哪里?

随着苹果宣布将在iPhone7/7 Plus上取消传统的3.5mm音频接口,不少动作快的手机厂商已经即使跟进了,目前乐视所有新机和摩托罗拉Moto Z均使用USB Type-C接口代替3.5mm音频接口,这样做究竟有什么好处呢? 基础知识 首先我们需要知道,3.5mm接口所传输的是立体声模拟音频,这也就…

TYPE-C接口的定义诠释以及功能参数挖掘

现在的安卓手机大多都采用了Type-C接口,如华为、荣耀、小米、三星、魅族等。对于这个接口,大家不再陌生,但大多数人对它的认识还停留在 “支持正反插”、“用来充电” 的基础层面。今天就来深入挖掘一下TYPE-C发展七年至今,为何能…

Type-C接口原理图,附引脚说明

维基链接:https://zh.wikipedia.org/wiki/USB_Type-C 针名描述针名描述A1GND接地B12GND接地A2SSTXp1SuperSpeed差分信号#1,TX,正B11SSRXp1SuperSpeed差分信号#1,RX,正A3SSTXn1SuperSpeed差分信号#1,TX&…

typec接口知识

typec接口定义(24脚) typec母头 typec公头(一对D,D-,只有一个CC脚,另一个CC脚变成了VCONN) D/D-:当USB3接口不可用的时候,这些引脚为USB2信号提供信号通道。 Vbus/GND:这些引脚能够为上行数据接口提供100W的供电能力,…

深入学习USB(6)USB Type-C接口定义概念解析

文章目录 **一、Usb type c接口定义介绍****二、USB3.1 type-c接口特性****三、USB Type-C接口的优点****四、usb type-c接引脚定义****五、usb type-c接口主要功能****六、usb type-c接口工作流程**七、市场上Type-C/PD有哪几种分类呢? 一、Usb type c接口定义介绍…

lightning接口_苹果Lightning接口与Type-C接口,谁更胜一筹?

曾几何时,在苹果的强势助攻下,Lightning接口在数码界曾一度混得风生水起!然而,近年来随着智能手机的发展,手机接口快速升级,其中Type-C接口凭借更快的数据传输、充电速度等优势,越来越多的出现在大家的视线中,隐隐盖过Lightning接口的风头,就连特立独行的苹果也对其青…

Type-C接口技术(一)

前言 电子产品接口的迅速发展是电子技术迅速发展的一个缩影,随着现在电子产品对数据传输和充电功率要求越来越高的情况下,一些以前常用接口开始慢慢被淘汰,而支持更高速率和充电功率的的Type-C接口慢慢开始大放异彩,此外支持盲插…

浅谈一下Type-C接口发展历程

1996年,由英特尔、微软、ibm等多家公司联合设计的usb标准问世,键盘、鼠标、智能手机以及打印机等等大多使用usb标准来实现供电和数据传输。 usb接口从诞生之初就是为了实现通用这个目的。在usb诞生之前,键盘、鼠标多使用ps二接口,…

TYPE-C接口电路设计篇(一)

常见USB接口类型 随着USB Type-C接口的推行,USB Type-C是一种通用串行总线(USB)的硬件接口形式,USB Type-C接口在消费类产品普及程度越来越高,常见的适配器、笔电、手机等产品都兼容USB Type-C设计,接口多…

Type-C接口

TYPE-C接口 USB Type-C接口的命名原语USB Type-C连接器,这是一种坚固的易于使用的接口。支持正反插,方便快捷。支持超高速率通信功能和功率输出。最大传输速率10Gbits/S,最大输出功率100W,最大电流5A。大小8.3mm X 2.5mm。 具有…

一文带你搞清楚USB、type-C、雷电三接口之间的区别与联系

缘起 最近某些新电脑的发布,看到带了全功能的type-c接口,一直搞不懂什么type-c还有什么全功能,半功能?和雷电3又有什么区别,雷电3又有什么全速,半速。由于搞不清,所以网上看了很多资料,这里总结一下以备后续查阅 说说USB 你肯定会说,这个我知道,就是下面这种的 没…

USB Type C 接口引脚详解

1. Type C 接口特点 Type C 是一组对称的连接器,在使用的过程中不需要如同使用 USBA,MinUSB,MicroUSB 那样来辨别接口方向。其次能够承受较高的功率所以可以支持高达 100W 的功率,所以使用该接口可以更好的支持快速充电&#xff0…

Macbook技巧,Type-c接口失灵怎么办

有时Macbook Pro电脑突然出现Type-c接口失灵的情况,这该怎么解决呢?可以参考小编的操作方法 1.关机 2.按下键盘右侧的 Shift键,左侧的Control和Option键不放。此时电脑会开机,等进入显示白条的状态,不要松开手&#x…

Java Type接口 运行时获取泛型类型

一、Type接口 Type是所有类型的父接口,他有4个子接口和一个实现类。 Class比较常见,它表示的是原始类型。Class类的对象表示JVM中的一个类或接口。每个Java类在JVM里都表现为一个Class对象,可以通过“类名.class”、“对象.getClass()”、…

关于type_C接口

文章目录 概要:一、引脚定义二、六脚Type_c三、12脚Type_c四、16脚Type_c五、usb3.0 概要: type-C接口外观好看,双面插等众多优点,已经成为了现在主流的接口。 一、引脚定义 VBus:总线电源,USB PD协议可配置电压&…

TYPE-C接口引脚详解

Type-C口有4对TX/RX分线,2对USBD/D-,一对SBU,2个CC,另外还有4个VBUS和4个地线。 1、当Type-C接口仅用作传输DP信号时,则可利用4对TX/RX,从而实现4Lane传输,这种模式称为DPonly模式;…

Java反射系列--Type接口及其子接口

原文网址:Java反射系列--Type接口及其子接口_IT利刃出鞘的博客-CSDN博客 简介 说明 Type 是java反射机制中提供的一个接口,用来表示java中的所有类型的接口。它们包括原始类型、参数化类型、数组类型、类型变量和基本类型。(这段话是Type源…

秒懂所有USB接口类型,USB接口大全;Type-A、Type-B、Type-C、miniUSB、microUSB区分

我们来聊一聊USB接口。由于USB-IF标准制定命名的混乱,大多数人都搞不清楚USB的各种版本命名,这里我们就好好捋一捋。。。 一、USB传输标准 自1996年USB-IF(USB Implementers Forum)组织发布USB 1.0标准以来,USB标准经…