📄 一句话概括
现代播放器普遍分三层:应用层/播放核心/渲染层——分层带来的直接好处是:换渲染方式不用动业务代码。
📝 本节和前面几节的关系
5.4.3 看了 VLC 的模块化,这一节看当代主流播放器的分层思路。
一、三层结构
应用层:界面、播放控制、业务逻辑——播放按钮、进度条、广告逻辑。 播放核心:解封装、解码、同步——不关心界面长什么样。 渲染层:硬解与软解、显示输出——只关心把帧画到屏幕上。
二、硬解与软解
软解:用 CPU 计算,兼容性最好,但功耗高、跑高分辨率吃力。 硬解:交给显卡或专用解码芯片,省电、能跑 4K,但受硬件能力限制。 所以现代播放器普遍是优先硬解、失败回退软解。 这也是【渲染层】支持多套实现的原因——同一份播放核心,下面挂不同后端。
三、分层的实际好处
最直接的一条:换渲染方式不动业务代码。 从软解切到硬解、从 OpenGL 换到别的渲染后端,应用层一行都不用改。 第二条:播放核心可以被多个端复用——手机、电视、网页各写各的应用层。 这就是为什么各大厂都会自研一层【播放核心】,而不是每端重写一遍。
四、和前面三节的呼应
5.4.1 的四环节,中间两个(解码、同步)就落在播放核心这一层。 5.4.2 的四步与 5.4.3 的五个模块,实现的是同一层的同一件事。 三者只是视角不同:一个是功能视角,一个是库的视角,一个是分层视角。
五、动手 Demo:现代播放器分成哪几层
现代播放器普遍分成三层,每层职责清楚。
rows = [("应用层", "界面、播放控制、业务逻辑", "播放按钮、进度条"),
("播放核心", "解封装、解码、同步", "ExoPlayer、IJKPlayer"),
("渲染层", "硬解与软解、显示输出", "MediaCodec、OpenGL")]
for a, b, c in rows:
print("%-8s %-20s %s" % (a, b, c))
实跑输出:
--------------------------------------------------------------------
现代播放器分成哪几层
--------------------------------------------------------------------
现代播放器普遍分成三层,每层职责清楚。
层级 职责 例子
---------------------------------------------------------------
应用层 界面、播放控制、业务逻辑 播放按钮、进度条
播放核心 解封装、解码、同步 ExoPlayer、IJKPlayer
渲染层 硬解与软解、显示输出 MediaCodec、OpenGL
分层带来的直接好处:**换渲染方式不动业务代码**。
同一套播放核心,**硬解软解切换只是换下面那层**。
分层带来的直接好处:换渲染方式不动业务代码。 同一套播放核心,硬解软解切换只是换下面那层。
30 秒实验
- 查一下你常用的一款播放器或 App,猜它用的是哪套播放核心。
- 再从它的设置里找找有没有【硬解开关】。
常见误区
- 把【播放核心】写成业务的一部分。这样换端就要重写。
- 以为硬解一定比软解好。硬件不支持的编码只能回退软解。
自测三问(点开对答案)
1. 现代播放器的三层是什么? —— 应用层、播放核心、渲染层。 2. 硬解与软解各有什么优劣? —— 硬解省电、性能强但受硬件限制;软解兼容性好但功耗高。 3. 分层架构最直接的好处是什么? —— 换渲染方式不用改业务代码,播放核心还能跨端复用。- ☐ 下一节(5.5.1 视频转码)
相关笔记
- 视频播放器简介 — 功能视角的四个环节
- FFmpeg播放架构与原理 — 库视角的四个步骤
- VLC播放原理 — 模块视角的五个模块
- 🎬 FFmpeg入门详解 · 索引