1. 前言
多媒体是什么?
维基百科的解释是:多媒体(Multimedia),在电脑应用系统中,组合两种或两种以上媒体的一种人机交互式资讯交流和传播媒体。使用的媒体包括文字、图片、照片、声音(包含音乐、语音旁白、特殊音效)、动画和影片,以及程序所提供的互动功能。目前为止,多媒体的应用领域已涉足诸如广告、艺术,教育,娱乐,工程,医药,商业及科学研究等行业。在物联网场景,多媒体的应用也越来越多。但不管是怎么样的使用场景,多媒体涉及到基础原理和底层知识都是一致的。
本文将聚焦在说明多媒体世界中的视频文件是怎么播放出来的。一个多媒体文件播放涉及到哪些过程?人体通过肉眼看到画面、通过耳朵听到视频声音,这中间经过了哪些处理?本文将尽可能通过简单易懂的文字讲述一个视频文件的播放流程。
2. 播放链路(Pipeline)
一个播放器的构成或者播放器的pipeline虽然有不同的实现,但大多遵循以下的流程:
这些部分功能大致如下:
- 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数据缓存,即可做到音视频数据同步。