音视频基础
参考
音视频编码格式
编码是指将原来的视频码流例如RGB流压缩,目的是减小数据量,否则传输的数据量很大,目前的带宽承载不了。
方法就是将相同数据做精简的描述,这里涉及到音视频的编码标准(不是编码算法),例如MPEG,H264,H265等。
常用名称 | 制定机构 | 发布 | 标准编号 | 标题 | 典型应用领域 |
---|---|---|---|---|---|
H.261 | ITU-T | 1990 | ITU-T H.261 | 运动图像编码标准 | 可视电话、会议电视、窄带ISDN |
MPEG-1 | ISO/IEC | 1991 | ISO/IEC 11172 | 运动图像和伴音的通用编码 | VCD等 |
JPEG | ITU-T ISO/IEC | 1992 | ITU-T T.81 ISO/IEC 10918 | 静止图像编码 | 数码相机、图像库等 |
MPEG-2 | ISO/IEC ITU-T | 1994 | ITU-T H.262 ISO/IEC 13818-2 | 运动图像和伴音的通用编码 | 数字电视传输、DVD |
H.263 | ITU-T | 1995 | ITU-T H.263 | 运动图像编码标准 | 多媒体通信等 |
MPEG-4 | ISO/IEC | 2000 | ISO/IEC 14496-2 | 基于对象的视音频编码 | 网络视音频等 |
JPEG2000 | ISO/IEC | 2000 | ISO/IEC 15444-3 | 静止图像编码 | 图像库、数字电视等 |
H.264/AVC MPEG-4-10/H265/HEVC | ITU-T ISO/IEC | 2003 | ITU-T R. H.264 ISO/IEC 14496-10 | 高级视频编码 | 数字电视、多媒体通信等 |
VC-1 | SMPTE | 2006 | SMPTE 421M | 电视视频流格式和解码处理 | 数字电视等 |
AVS/AVS+/AVS2/AVS3 | SAC(中国) | 2006 | GB/T 20090-2006 | 信息技术 先进视音频编码 | 数字电视、网络视频等 |
SVAC | SAC(中国) | 2010 | GB/T 25724-2010 | 安全防范监控数字视音频编解码技术要求 | 安防监控 |
音视频封装格式
编码后的码流,是纯数据流,但是在即将进入到播放器以后,怎么知道他是一个音视频而不是一个文件呢?怎么知道如何播放它?所以要进行封装也就是Mux复用。封装可以理解成把连续不断的数据码流装进一个一个容器里,也就是盒子,这个容器里不仅装了纯数据流,还装了很多操作说明对自己进行描述,以便能让终端知道怎么解析、怎么解码、怎么播放等。这个操作说明就是封装头。也就是每个容器里都会在原有数据流的基础上加一个封装头。常见的封装格式有哪些呢?
封装格式 | 视频编码格式 | 音频编码格式 |
---|---|---|
MKV | MPEG1/2/4 H.264/AVC | MP3等 |
MP4 | MPEG-4 H.264/AVC | MP3 |
TS |
MP4封装格式
参考MP4
使用Box进行描述,一个视频被装进一个叫mp4的大盒子里,这个大盒子里面又装了很多用来描述、起控制作用的小盒子Box、还有装数据的小盒子。Box可以理解成一个对象,每个box里面可以装一些小box和数据。 MP4 最外层的 box 主要有三个,分别是 File Type box(ftyp box)、Movie box(moov box)和 Media Data box(mdat box)。其中最重要、最复杂的就是 moov box 了,它里面存放了音视频的基本信息和每一个音视频数据的具体位置。
另外,在 MP4 文件中,视频的一帧和音频的一段编码数据称为一个 sample。连续的几个 sample 称之为 chunk,而视频的所有 sample 称为一个视频 track,同样音频的所有 sample 也称为一个音频 track。
因此一般 MP4 文件是由音频 track 和视频 track 组成,而 track 由 sample 组成,其中若干个 sample 组成一个 chunk。
TS封装格式
参考TS精简
TS全称是MPEG2-TS。每个TS包都是可以独立播放的,可以认为是视频播放软件的最小播放单元,例如在我们用爬虫去爬一个视频的时候就是先找到一个m3u8索引文件,然后爬到CDN上存储的每个TS片段,对于每个TS都可以播放了,只不过电影会按照顺序去播放这些TS片段。
每个TS包是由两部分组成:TS HEADER、Payload
payload就是PES数据层,可能是PAT或者PMT或者基础码流等。TS HEADER里的PID字段会描述这个TS包是控制包(PAT 或PMT)还是普通的数据包即PES包。
PES就是基本码流ES的前面加上了时间戳。