简述
播放视频前得知道要播放的视频是什么格式的,所以第一步是数据接收。接受完数据后,需要对视频做一个解复用(demux)的处理,分解为图像轨道(track)、音频轨道、字幕轨道。分解完之后,则需要进行解码,图像解码、音频解码,解码完才是输出,调用显示设备播放。
一、数据接收
播放器的模型其实就是输入输出模型,输入的是视频文件,如MP4文件,或者http/httpLiveStream(http流),还有rtp数据包(直播),ftp,ts(电视广播)等。视频文件的封装格式,简单理解为后缀,其实就是容器类型,为什么叫容器,后文会谈到。下表列出了常见的容器类型,普通用户最常见的是.mp4文件,而宅男用户最常见的是.avi文件????
视频容器类型 | 说明 |
---|---|
avi(audio video interleave) | 微软出品 |
wmv | 微软出品 |
mp4 | mpeg组织 |
ts | mpeg组织,一般用于数字电视广播 |
mkv | 某开源组织 |
rmvb/rm | RealNetworks公司,私有标准不公开 |
flv | adobe 保护版权用 |
不同的容器类型,每一种容器的头部信息都是不同的,头部信息包括视频时长、创建时间等基本信息。所以数据解析这一步,就是统一一个接口,来处理不同的数据来源。提供不同的数据包解析器,将接收到的数据解成相应的容器类型。
ffmpeg中的AVFormatContext有个方法:avformat_open_input就是用来做数据解析用的,解析完的数据通过context可以拿到。
二、容器解析(解复用demux)
得知视频容器的类型之后,就可以对其进行解复用了。为什么要进行解复用,得先了解复用(mux)的过程。复用的结果是生成一个视频容器,即某一种格式(如mp4)的视频。
每一个视频文件中,其实都包含了多种轨道(track),图像的轨道就是我们看到的画面,音频轨道就是我们听到的声音,而字幕轨道就是显示出来的字幕。如果视频文件不用经过传输,那这几个轨道的资源(resource)其实可以不用经过复用而合成到容器里。正是由于要传输,所以必须把不同轨道的资源集中在一起,然后经过网络或者其他方式传输到目的地。所以,复用的过程就是将多个轨道的资源合成为一个容器。
所以解复用的过程,就是将视频文件中的多个轨道给分解出来。不同的容器需要不同的解析器,比如mp4和flv的解复用就要用不同的解析器。
在ffmepg中,解复用所需的信息其实都由上一步获得的context提供,然后调用不同的demux接口,对音频轨道和图像轨道进行分离。
三、数据解码
第二步一般会产生图像、声音、文本三种不同轨道。图像会有大小,声音也会有大小,如果不对图像和声音进行编码处理,对视频的传输会带来非常大的阻碍。所以数据解码这一步,做的视频就是将经过编码后传输的图像轨道和声音轨道进行解码。编解码也有各种格式。下表列出了常见的几种格式。
编码格式 | 应用场景 | 说明 |
---|---|---|
mpeg-1 | vcd | mpeg最初的版本 |
mpeg-2 | DVD | mpeg |
mpeg-4 | mp4 | 随计算机运算能力增强后逐渐产生的 |
h.264 | everywhere | mpeg和itu-t练手组成JVT(joint video team)制定 avc/mpeg part 10 |
vc-1 | null | null |
realvideo | null | 私有标准 |
其中最需要关注的就是h.264,目前绝大多数视频编解码的格式。编码格式涉及到的I帧,P帧,B帧,分别对应帧内解码,帧间预测,双向预测的编解码方式。
四、数据输出
视频解码后通常是yuv的数据,音频则通常解为pcm文件,对这些文件的读取和还原,就是外接设备的事情了,输出给外接设备即可正常播放视频。具体外接设备怎么解析这些数据,就不在本文的讨论范围内了。
from :http://www.jianshu.com/p/82e778eb618b