🎬 第五章 视频基础
📄 一句话概括

现代播放器普遍分三层:应用层/播放核心/渲染层——分层带来的直接好处是:换渲染方式不用动业务代码。

📝 本节和前面几节的关系

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 秒实验

  1. 查一下你常用的一款播放器或 App,猜它用的是哪套播放核心。
  2. 再从它的设置里找找有没有【硬解开关】。

常见误区

  1. 把【播放核心】写成业务的一部分。这样换端就要重写。
  2. 以为硬解一定比软解好。硬件不支持的编码只能回退软解。
自测三问(点开对答案) 1. 现代播放器的三层是什么? —— 应用层、播放核心、渲染层。 2. 硬解与软解各有什么优劣? —— 硬解省电、性能强但受硬件限制;软解兼容性好但功耗高。 3. 分层架构最直接的好处是什么? —— 换渲染方式不用改业务代码,播放核心还能跨端复用。

相关笔记