带你走进多媒体世界:视频文件是怎么播放出来的

简介: 本文将聚焦在说明多媒体世界中的视频文件是怎么播放出来的。一个多媒体文件播放涉及到哪些过程?人体通过肉眼看到画面、通过耳朵听到视频声音,这中间经过了哪些处理?本文将尽可能通过简单易懂的文字讲述一个视频文件的播放流程。
来源 | HaaS技术社区

不看这几篇好文,就别说自己了解物联网

1. 前言

多媒体是什么?

维基百科的解释是:多媒体(Multimedia),在电脑应用系统中,组合两种或两种以上媒体的一种人机交互式资讯交流和传播媒体。使用的媒体包括文字、图片、照片、声音(包含音乐、语音旁白、特殊音效)、动画和影片,以及程序所提供的互动功能。目前为止,多媒体的应用领域已涉足诸如广告、艺术,教育,娱乐,工程,医药,商业及科学研究等行业。在物联网场景,多媒体的应用也越来越多。但不管是怎么样的使用场景,多媒体涉及到基础原理和底层知识都是一致的。

本文将聚焦在说明多媒体世界中的视频文件是怎么播放出来的。一个多媒体文件播放涉及到哪些过程?人体通过肉眼看到画面、通过耳朵听到视频声音,这中间经过了哪些处理?本文将尽可能通过简单易懂的文字讲述一个视频文件的播放流程。

2. 播放链路(Pipeline)

一个播放器的构成或者播放器的pipeline虽然有不同的实现,但大多遵循以下的流程:

image.png

这些部分功能大致如下:

  • MediaSource:视频源文件的来源
  • Demux:音视频数据分离
  • Video\Audio Decode:音视频数据解码
  • Video\Audio Ouput:音频数据外放、视频帧渲染
  • AVSync:音视频同步

3. MediaSource

接下来从视频源开始讲起。视频源也就是MediaSource,MediaSource也就是多媒体的数据源,这些数据源包括:

  • 本地存储介质的视频文件,uri以“file:\\“前缀;
  • 来源于网络http协议传输,uri以“http:\”前缀;
  • 来源于网络rtsptp协议传输,uri以“rtsp:\”前缀;

MediaSource实现一般会有read、seek的抽象,根据不同的source来源有不同read、seek操作的实现;这些实现为后续的AV Demux提供数据输入流。

4. Demux

有了视频源之后,接下来就是要把获取到的音视频文件做基本的分析处理了,这里就必须要提到Demux了。Demux部分起到的作用是把音视频文件或者音视频数据流中的音频数据与视频数据分离,分离供后续的音视频decode分别解码。

在demux部分不得不提到AVFormat的概念,这个可以理解为音视频的数据的封装格式,封装格式的意义在于把视频帧与音频帧按照一定格式交织封装,便于存储、传输及分离。

AVFormat封装格式的意义是什么呢?

倘若没有封装格式的交织封装,那会出现大段的视频数据后接音频数据的情况,在最终音视频同步输出方面是不利的,一个好的封装格式可以减少更少的AV数据缓存,即可做到音视频数据同步。

介绍了一些AVFormat的概念,那当在讲AVFormat的时候,到底讲的是什么?其实在日常的接触中,已经有打过照面了,比如大家熟知的视频文件后缀如.mp4、.mp3、.ts、.mkv,这些都是通过文件后缀看到AVFormat。

下面以MP4格式为例简单介绍一下AVFormat的具体内容:

image.png

(图片来源:https://www.cnblogs.com/CoderTian/p/8277965.html

MP4格式就是由一个个的box组合成的box树,所有的数据都包含在box里,下面来了解一下box的基本结构。一个box是由box header和box里面包含的数据组成的,如下图所示:

image.png

(图片来源:https://www.cnblogs.com/CoderTian/p/8277965.html

整个box以box header开头,box header中包含了box的大小(size)和类型(type)等信息。其中,size指明了整个box所占用的大小,包括header部分,如果box很大(例如存放具体视频数据的mdat box),超过了uint32的最大数值,size就被设置为1,并用接下来的64位uint64的largesize来存放大小。box中的字节序为网络字节序,也就是大端字节序(Big-Endian)。box根据header部分包含的信息的不同可以分为box和full box。

一个MP4文件中,主要需要了解的是存储音视频的metadata和音视频数据的box,metadata主要在moov box,音视频数据在mdat box中。

5. Video Decode

解析了音视频文件之后,接下来就需要对音视频分别进行解码了。这里先来看看视频解码。Video Decode就是视频解码,在提到视频解码之前,需要先看一下什么是视频帧。

5.1 视频帧介绍

视频都是由静止的画面组成的, 这些静止的画面被称为帧。为了节省存储空间和传输带宽,视频帧都是通过某个特定的压缩算法压缩而成的,根据压缩算法,视频帧又分为I帧、P帧和B帧。

  • I帧(I frame)

又称为内部画面 (intra picture),I 帧通常是每个 GOP(MPEG 所使用的一种视频压缩技术)的第一个帧,经过适度地压缩,做为随机访问的参考点,可以当成图像。I帧的编码流程如下:

image.png

而解码刚好利用了DCT转化的可逆性,是编码流程的逆过程。

  • P帧

前向预测编码帧。P帧表示的是这一帧跟之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。

  • B帧

双向预测内插编码帧。B帧是双向差别帧,也就是B帧记录的是本帧与前后帧的差别,换言之,要解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。

5.2 色彩空间

I帧、P帧、B帧decode完可以理解为是一帧帧画面,图像的组成可以理解为一个个像素组成,像素的表示涉及到色彩空间,常见的色彩空间包括如下:

  • RGB

工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一。

  • YUV

YUV是编译true-color颜色空间(color space)的种类,YUV、YCbCr、YPbPr等专有名词都可以称为YUV,彼此有重叠。“Y”表示明亮度灰阶值,“U”和“V”表示的则是色度,作用是描述影像色彩及饱和度,用于指定像素的颜色。

  • YUV 4:4:4采样,每一个Y对应一组UV分量。
  • YUV 4:2:2采样,每两个Y共用一组UV分量。
  • YUV 4:2:0采样,每四个Y共用一组UV分量。

在多媒体视频领域,多用的是YUV的颜色空间。

6. Audio Decode

看完了视频解码,接下来可以来看看音频解码了,Audio Decode就是音频解码。

6.1 audio 编解码介绍

  • MP3

MP3即MPEG Audio LayerIII,是一种数字音频编码和有损压缩格式,它被设计来大幅降低音频数据量,通过舍弃PCM音频数据中对人类听觉不重要的部分,达成压缩成较小文件的目的。MP3编码的流程如下:

image.png

  • AAC

出现于1997年,基于MPEG-2的音频编码技术。由Fraunhofer IIS、杜比实验室、AT&T、Sony等公司共同开发,目的是取代MP3格式。2000年,MPEG-4标准出现后,AAC重新集成了其特性,加入了SBR技术和PS技术,为了区别于传统的MPEG-2 AAC又称为MPEG-4 AAC。

  • AC3

AC3(全称Audio Coding3音频编码3)是杜比数码的同义词,杜比数码是一种高级音频压缩技术,它最多可以对6个比特率最高为448kbps的单独声道进行编码

音频数据decode完是一些列的PCM数据。

6.2 PCM介绍

即脉冲编码调制(Pulse Code Modulation,PCM),PCM中,channel的概念。PCM数据靠一个个sample采样描述,用一个个非连续的采样点描述现实中连续的声纹。

channel

  • Mono:单声道
  • Stereo:立体声,双声道
  • 四声环绕
  • 5.1声道:杜比、dts
  • 7.1声道

sample 位深,即每个sample数据的精度,bit数

  • U8:无符号8bit
  • S8:有符号8bit
  • S\U16LE\BE:有\无符号小\大端16bit
  • S\U32LE\BE:有\无符号小\大端32bit
  • F32:Float 32bit

sample rate,即每秒采样数

  • 8kHz
  • 16kHz
  • 32kHz
  • 44.1kHz
  • 48kHz
  • ...

7. AVsync

音视频最终渲染输出时,要考虑音视频的同步。在音视频同步中,不得不先了解PTS与DTS的概念。

  • PTS

即Presentation Time Stamp,显示时间戳,代表了每一个音视频帧的显示时间戳。

  • DTS

即Decode Time Stamp,解码时间戳,代表每一帧音视频帧的decode时间戳。

以下是PTS\DTS的例子:

image.png

图片从左至右是视频帧的先后文件组织顺序,也是dts的先后顺序,上面标示的是PTS的顺序即显示的顺序,所以看到第三帧画面是再第四个顺序显示的。

AVSync的方法:

Audio Master

Audio Master即以audio的pts作为视频的参考时钟,让audio数据按照自己的pts顺序播,视频显示时参考音频当前的pts,以决定当前视频帧是要repeat还是因为太迟丢弃。在存在音频数据的情况下, 这个是通常的AVSync方式,原因如下:

  • 人耳对声音的敏感度是高于视频的,丢音频帧会明显感觉到声音异常或者pupu音。
  • 音频数据采样率是固定的,采样率固定的情况下,数据的输出速度是持续平稳的,这是一个天然优势的时间参考依据。

 

Video Master

通常在无音频数据时作为参考。

 

外部时钟作为Master

这个是音视频pts都遵照外部时钟作为参考。

8. Video Render

视频的输出显示需要依靠Video Render来完成。Video 的渲染显示一般基于一些图形库做,比如SDL\OpenGL等等,这些都可以作为图形显示的技术模块,在android上有基于OpenGL封装的surface view,借助surfaceflingle显示。AliOS Things上会有HaaS UI。图形渲染也是一块比较专业的知识,后续会用其他文章来介绍。

9. Audio Output

音频的输出播放需要依靠Audio Output来完成。Audio Output部分是讲PCM数据交到音频设备播放,常见的选择有ALSA等实现。AliOS Things上会有A2SA。音频播放也是一块比较专业的知识,后续会用其他文章来介绍。

10. 总结

到这里一个视频文件总算是播放出来了,是不是非常不容易?这里面确实也涉及到很多专业知识,但总结起来你只要记住4个要素就可以了:

  1. 视频文件来源
  2. 视频文件格式解析及音视频数据分离
  3. 音视频解码
  4. 音视频播放及同步

是不是又觉得没那么复杂?愿大家在知识的海洋中能找到最适合自己的学习方式,不断学习,保持进步!

更多精品好文

 

物联网云端一体AI方案的探索

物联网设备连接的下一个引爆点:4G Cat.1

物联网教育现状和前景

一文看懂蓝牙在物联网中的应用场景

下一个智能硬件爆品是什么?

华为、阿里、小米都在用的全屋智能技术

为什么物联网领域使用Rust的项目越来越多?

开源硬件的前世今生

物联网碎片化的一些思考

边缘计算在物联网行业的应用

物联网太难 ? 不妨试试用Python来开发

5G会给物联网行业带来哪些变化?

必须要了解的物联网安全知识

ARMv9能给ARM带来新一轮腾飞吗?(安全篇)

ARMv9能给ARM带来新一轮腾飞吗?(人工智能篇)

国产物联网操作系统的出路在哪里?

RISC-V架构能否引领物联网时代?

物联网到底为什么这么火?

谁才是物联网连接技术中的王者?

物联网平台大量出现能否将行业带入爆发式发展

脚本语言适合物联网开发吗

从“嵌入式”到“物联网”的四大转变

物联网发展新趋势

相关实践学习
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
相关文章
|
SQL 缓存 Java
殷浩详解DDD系列 第三讲 - Repository模式
# 第三讲 - Repository模式 **写在前面** 这篇文章和上一篇隔了比较久,一方面是工作比较忙,另一方面是在讲Repository之前其实应该先讲Entity(实体)、Aggregate Root(聚合根)、Bounded Context(限界上下文)等概念。但在实际写的过程中,发现单纯讲Entity相关的东西会比较抽象,很难落地。所以本文被推倒重来,从Repository
37996 8
|
人工智能 自然语言处理 程序员
提交通义灵码创新实践文章,重磅好礼只等你来!
通义灵码创新实践征集赛正式开启,发布征文有机会获得重磅好礼+流量福利,快来参加吧!
21580 21
|
编解码 JavaScript 前端开发
使用 MediaSource 规范实现自适应流播放
【10月更文挑战第26天】通过以上步骤,就可以使用MediaSource规范实现自适应流播放,根据网络状况动态地调整播放的码率,为用户提供更流畅的观看体验。需要注意的是,实际应用中还需要处理更多的细节和错误情况,以确保播放的稳定性和可靠性。
|
存储 自然语言处理 关系型数据库
谷粒商城笔记+踩坑(9)——上架商品spu到ES索引库
ES回顾、【查询模块】保存ES文档、【库存模块】库存量查询、【商品模块】上架单个spu
谷粒商城笔记+踩坑(9)——上架商品spu到ES索引库
|
自然语言处理 运维 开发工具
深入探讨了 NeoVim 相较于传统 Vim 的优势,包括更好的扩展性、现代化的界面和用户体验、多语言编程支持、强大的异步处理能力、更好的协作支持、持续的更新和改进、活跃的社区以及与现代开发工具的集成
本文深入探讨了 NeoVim 相较于传统 Vim 的优势,包括更好的扩展性、现代化的界面和用户体验、多语言编程支持、强大的异步处理能力、更好的协作支持、持续的更新和改进、活跃的社区以及与现代开发工具的集成。通过命令对比,展示了两者在启动、配置、模式切换、移动编辑、搜索替换、插件管理、文件操作、窗口缓冲区管理和高级功能等方面的差异。总结部分强调了 NeoVim 在多个方面的显著优势,解释了为什么越来越多的运维人员选择 NeoVim。
893 3
|
数据采集 机器学习/深度学习 TensorFlow
声纹识别实战:从数据采集到模型训练
【10月更文挑战第16天】声纹识别技术通过分析个人的语音特征来验证其身份,具有无接触、便捷的特点。本文将带你从零开始,一步步完成声纹识别系统的构建,包括数据采集、音频预处理、特征提取、模型训练及评估等关键步骤。我们将使用Python语言和相关的科学计算库来进行实践。
2274 0
|
机器学习/深度学习 自然语言处理 机器人
深度剖析模型微调与RAG技术的完美融合:从理论到实践,带你全面了解如何利用RAG提升特定领域任务性能并附带代码示例
【10月更文挑战第2天】随着深度学习的发展,预训练模型因通用表示能力和高效性备受关注。模型微调通过在已训练模型基础上进行再训练,使其适应特定任务或数据集,提升性能。RAG(Retrieval-Augmented Generation)结合检索与生成技术,在生成响应前检索相关信息,特别适用于需要背景知识的任务。本文通过构建医学问答机器人的示例,展示如何初始化RAG模型并利用实际数据集进行微调,从而提升生成答案的准确性和可信度。
774 4
|
XML JSON API
深入理解RESTful API设计:最佳实践与实现
【10月更文挑战第9天】深入理解RESTful API设计:最佳实践与实现
596 1
【51单片机】通过定时器中断 在8位数码管显示时间
【51单片机】通过定时器中断 在8位数码管显示时间
345 2