本节对视频相关知识进行了详细的介绍及讲解。
说视频之前,先要说说图像。
图像,大家都知道,是由很多“带有颜色的点”组成的。这个点,就是“像素点”。
像素点的英文叫 Pixel(缩写为 PX)。像素是图像显示的基本单位。
我们通常说一幅图片的大小,例如是 1920×1080,就是宽度为 1920 个像素点,高度为 1080 个像素点。乘积是 2,073,600,也就是说,这个图片是两百万像素的。
1920×1080,这个也被称为这幅图片的分辨率。
分辨率也是显示器的重要指标
PPI,就是“Pixels Per Inch”,每英寸像素数。也就是,手机(或显示器)屏幕上每英寸面积,到底能放下多少个“像素点”。
三原色:红色(Red) 、绿色( Green) 、蓝色( Blue)
在计算机里,R、G、B 也被称为“基色分量”。它们的取值,分别从 0 到 255,一共 256 个等级(256 是 2 的 8 次方) 。
通过这种方式, 一共能表达多少种颜色呢?
256×256×256=16,777,216 种, 因此也简称为 1600 万色。
RGB 三色,每色有 8bit,这种方式表达出来的颜色,也被称为 24 位色(占用 24bit) 。
基本介绍之前的博文已有讲解,这里不再赘述,参考音视频入门基础理论知识
编码:就是按指定的方法,将信息从一种形式(格式) ,转换成另一种形式(格式) 。
视频编码:就是将一种视频格式,转换成另一种视频格式。
编码的终极目的,说白了,就是为了压缩。
视频通信系统之所以要采用 YUV,而不是 RGB,主要是因为 RGB 信号不利于压缩。
主流的采样方式有三种:
通常用的是 YUV4:2:0 的采样方式, 能获得 1/2 的压缩率。
数字视频可以理解为自然场景空间和时间的数字采样表示。
针对 HVS 的特点, 数字视频系统的设计应该考虑哪些因素?
既然视频是由许多静态图片组成的,那么视频的每一张静态图片就叫一帧。
视频帧又分为 I 帧、 B 帧和 P 帧:
帧数其实就是为帧生成数量的简称,可以解释为静止画面的数量。
定义:用于测量显示帧数的量度。单位为 FPS(Frames per Second, 每秒显示帧数)或赫兹(Hz) 。
帧率越高,画面越流畅、逼真,对显卡的处理能力要求越高,数据量越大。
帧率(Frame rate) = 帧数(Frames)/时间(Time), 单位为帧每秒(f/s,frames per second,fps)。
60 FPS:在做页面性能优化时,常用 60FPS 作为一个基准,所以需要尽量让每一帧的渲染控制在 16ms 内, 这样才能达到一秒 60 帧的流畅度。
屏幕每秒画面被刷新的次数,分为垂直刷新率和水平刷新率,一般我们提到的都是指垂直刷新率,以赫兹(Hz)为单位,刷新率越高,图像就越稳定,图像显示就越自然清晰。
目前,大多数显示器根据其设定按 30Hz、60Hz、120Hz 或者 144Hz 的频率进行刷新。 而其中最常见的刷新频率是 60 Hz。这样做是为了继承以前电视机刷新频率为 60Hz 的设定。
视频、图片的画面大小或尺寸。分辨率是以横向和纵向的像素数量来衡量的,表示平面图像的精细程度。
视频精细程度并不只取决于视频分辨率,还取决于屏幕分辨率
1080P 的 P 指 Progressive scan( 逐行扫描) ,即垂直方向像素点,也就是 “高”,所以 1920X1080 叫 1080P,不叫 1920P。
当 720P 的视频在 1080P 屏幕上播放时,需要将图像放大,放大操作也叫上采样。
单位时间播放连续的媒体如压缩后的音频或视频的比特数量。常用单位“比特每秒”,缩写是“bit/s”。比特率越高,带宽消耗得越多。
比特率即码率,在不同领域有不同的含义,在多媒体领域,指单位时间播放音频或视频的比特数,可以理解成吞吐量或带宽。
单位为 bps,即 bits per second,每秒传输的数据量,常用单位有:kbps、mbps 等
计算公式: 码率(kbps)= 文件大小(kb) / 时长(s)
简称为 VBR,即 Variable Bit Rate,比特率可以随着图像复杂程度的不同而随之变化。图像内容简单的片段采用较小的码率,图像内容复杂的片段采用较大的码率,这样既保证了播放质量,又兼顾了数据量的限制。
简称为 CBR, 即 Constant Bit Rate, 比特率恒定。图像内容复杂的片段质量不稳定, 图像内容简单的片段质量较好。
RGB 和 YUV 这里不再赘述,我们讲一下 HSV
HSV
HSV 模型的三维表示从 RGB 立方体演化而来。设想从 RGB 沿立方体对角线的白色顶点向黑色顶点观察,就可以看到立方体的六边形外形。 六边形边界表示色彩, 水平轴表示纯度,明度沿垂直轴测量。
常见的视频文件格式如 1.avi,2.mpg 这些都叫做视频的文件格式,它由你电脑上安装的视频播放器关联。
AVI,MPEG,VOB 是一种视频封装格式,相当于一种储存视频信息的容器。
常用视频格式及对应的文件格式:
视频封装格式 | 视频文件格式 |
---|---|
AVI(Audio Video Interleave) | AVI |
WMV(Windows Media Video) | WMV |
MPEG(Moving Picture Expert Group)分为 MPEG-1,MPEG-2,MPEG-4 | MPG MPEG VOB DAT 3GP MP4 |
Matroska | MKV |
Real Video | RM RMVB |
QuickTime File Format | MOV |
Flash Video | FLV |
所谓视频编码方式就是指能够对数字视频进行压缩或者解压缩( 视频解码)的程序或者设备。通常这种压缩属于有损数据压缩。
也可以指通过过特定的压缩技术,将某个视频格式转换成另一种视频格式。常见的编码方式有:
视频的编码格式才是一个视频文件的本质所在,不要简单的通过文件格式和封装形式来区分视频。
对于任何一部视频来说,只有图像,没有声音,肯定是不行的。所以,视频编码后,加上音频编码,要一起进行封装。
封装格式也称多媒体容器,它只是为多媒体编码提供了一个“外壳”。
封装格式业界也有人称音视频容器,比如我们经常看到的视频后缀名:mp4、rmvb、 avi、mkv、mov 等就是音视频的容器,它们将音频和视频甚至是字幕一起打包进去,封装成一个文件。
封装格式:AVI、VOB、WMV、RM、RMVB、MOV、MKV、FLV、MP4、MP3、WebM、DAT、3gpp、asf、mpeg、ogg
视频文件的封装格式并不影响视频的画质,影响视频画面质量的是视频的编码格式。
MP4(MPEG-4 Part 14)是一种常见的多媒体容器格式,它是在 “ISO/IEC 14496-14” 标准文件中定义的,属于 MPEG-4 的一部分。
MP4 是一种较为全面的容器格式,被认为可以在其中嵌入任何形式的数据,不过我们常见的大部分的 MP4 文件存放的 AVC(H.264)或 MPEG-4(Part 2)编码的视频和 AAC 编码的音频。MP4 格式的官方文件后缀名是 “.mp4”,还有其他的以 mp4 为基础进行的扩展或者是阉割版的格式,如 M4V、3GP、F4V 等。
box 结构树
MP4 文件中所有数据都装在 box 中,也就是说 MP4 由若干个 box 组成,每个 box 有类型和长度,包含不同的信息,可以将 box 理解为一个数据对象块。box 中可以嵌套另一个 box,这种 box 称为 container box。
MP4 文件 box 以树形结构的方式组织,一个简单的 MP4 文件由以下 box 结构数组成( mp4info 工具查看 MP4 文件结构):
根节点之下,主要包含以下三个 box 节点:
容器 AVI(Audio Video Interleaved)即音视频交错格式是一门成熟的老技术,尽管国际学术界公认 AVI 已经属于被淘汰的技术, 但是简单易懂的开发 API 还在被广泛使用。
AVI 符合 RIFF(Resource Interchange File Format)文件规范,使用四字符码 FOURCC(four-character code)来表征数据类型。AVI 的文件结构分为头部、主体和索引三部分。主体中图像数据和声音数据是交互存放的,从尾部的索引可以索引跳到自己想放的位置。
AVI 中有两种最基本的数据单元,一个是 chunk,一个是 list。这两种结构如下:
AVI 文件采用 RIFF 文件结构方式,使用四字符码 FOURCC(four-character code) 来表征数据类型,比如 ‘RIFF’、‘AVI’、‘LIST’ 等,通常我们称四字符码为数据块 ID。因此首先我们需要了解一个标准 RIFF 文件结构。
RIFF 文件的基本单元叫做数据块(Chunk),如上面基本数据单元的介绍,由数据块四字符码(数据块 ID)+ 数据长度 + 数据组成。
整个 RIFF 文件可以看成一个数据块,其数据块 ID 为 “RIFF”, 称为 RIFF 块。一个RIFF 文件中只允许存在一个 RIFF 块。
RIFF 块中包含一系列其他子块,其中 ID 为 “LIST” 称为 LIST 块,LIST 块中可以再包含一系列其他子块,但除了 LIST 块外的其他所有的子块都不能再包含子块。
有了 RIFF 文件结构的了解,下面这张 AVI 文件结构图就比较好理解了。需要说明的是,一个 AVI 通常都包含以下几个字块:
FLV( Flash Video)是现在非常流行的流媒体格式,由于其视频文件体积轻巧、封装播放简单等特点,使其很适合在网络上进行应用,目前主流的视频网站无一例外地使用了 FLV 格式。另外由于当前浏览器与 Flash Player 紧密的结合,使得网页播放 FLV 视频轻而易举,也是 FLV 流行的原因之一。
FLV 是流媒体封装格式,我们可以将其数据看为二进制字节流。总体上看,FLV 包括文件头(File Header)和文件体(File Body)两部分,其中文件体由一系列的 Tag 及 Tag Size 对组成。
先来一张图, 这是《东风破》 ——周杰伦(下载) 的一个 MV 视频。我使用的是 Binary Viewer 的二进制查看工具。
TS 全称是 MPEG2-TS,MPEG2-TS 是一种标准容器格式,传输与存储音视频、节目与系统信息协议数据,广泛应用于数字广播系统,我们日常数字机顶盒接收到的就是 TS( Transport Stream,传输流)流。
TS 传输流
首先需要先分辨 TS 传输流中几个基本概念
为便于传输,实现时分复用,基本流 ES 必须打包,就是将顺序连续、连续传输的数据流按一定的时间长度进行分割,分割的小段叫做包,因此打包也被称为分组。
MPEG-2 标准中,有两种不同的码流可以输出到信号,一种是节目码流(PS Program Stream),一种是传输流(TS Transport Stream) 。
由于 TS 码流具有较强的抵抗传输误码的能力,因此目前在传输媒体中进行传输的MPEG-2 码流基本上都采用 TS。
将 PES 包内容分配到一系列固定长度的传输包(TS Packet)中。TS 流中 TS 传输包头加入了 PCR(节目参考时钟)与 PSI(节目专用信息) ,其中 PCR 用于解码器的系统时钟恢复。
PCR 时钟作用:我们知道,编码器中有一个系统时钟,用于产生指示音视频正确显示和解码的时间标签(DTS、PTS) 。解码器在解码时首先利用 PCR 时钟重建与编码器同步的系统时钟,再利用 PES 流中的 DTS、PTS 进行音视频的同步。
M3U8 是 Unicode 版本的 M3U,用 UTF-8 编码。“M3U” 和 “M3U8” 文件都是苹果公司使用的 HTTP Live Streaming(HLS)协议格式的基础,这种协议格式可以在 iPhone和 Macbook 等设备播放。
可以看到,m3u8 文件其实是 HTTP Live Streaming(缩写为 HLS)协议的部分内容,而 HLS 是一个由苹果公司提出的基于 HTTP 的流媒体网络传输协议。
HLS 的工作原理是把整个流分成一个个小的基于 HTTP 的文件来下载,每次只下载一些。
简而言之,HLS 是新一代流媒体传输协议,其基本实现原理为将一个大的媒体文件进行分片,将该分片文件资源路径记录于m3u8 文件(即 playlist) 内,其中附带一些额外描述(比如该资源的多带宽信息···)用于提供给客户端。客户端依据该 m3u8 文件即可获取对应的媒体资源,进行播放。
m3u8 文件实质是一个播放列表( playlist),其可能是一个媒体播放列表(MediaPlaylist),或者是一个主列表(Master Playlist) 。但无论是哪种播放列表, 其内部文字使用的都是 utf-8 编码
当 m3u8 文件作为媒体播放列表(Meida Playlist) 时,其内部信息记录的是一系列媒体片段资源,顺序播放该片段资源,即可完整展示多媒体资源。其格式如下所示:
对于点播来说,客户端只需按顺序下载上述片段资源,依次进行播放即可。而对于直播来说,客户端需要定时重新请求该 m3u8 文件,看下是否有新的片段数据需要进行下载并播放。
当 m3u8 作为主播放列表(Master Playlist) 时,其内部提供的是同一份媒体资源的多份流列表资源(Variant Stream) 。
该备用流资源指定了多种不同码率,不同格式的媒体播放列表,并且,该备用流资源也可同时提供不同版本的资源内容, 比如不同语言的音频文件, 不同角度拍摄的视屏文件等等。客户可以根据不同的网络状态选取合适码流的资源,并且最好根据用户喜好选择合适的资源内容。
原因:未经压缩的数字视频的数据量巨大
原始视频压缩的目的是去除冗余信息,可以去除的冗余包括:
定义:通过特定的压缩技术,将某个视频格式的文件转换成另一种视频格式。
视频数据在时域和空域层面都有极强的相关性,这也表示有大量的时域冗余信息和空域冗余信息,压缩技术就是去掉数据中的冗余信息。
视频压缩编码技术可分为两大类:无损压缩和有损压缩。
无损压缩也称为可逆编码,重构后的数据与原数据完全相同,适用于磁盘文件的压缩等。主要采用熵编码方式,包括香农编码、 哈夫曼编码和算术编码等。
有损压缩也称为不可逆编码,重构后的数据与原数据有差异,适用于任何允许有失真的场景,例如视频会议、可视电话、视频广播、视频监控等。
编码方式包括预测编码、变换编码、量化编码、混合编码等。
即 Group of picture(图像组),指两个 I 帧之间的距离,Reference(参考周期)指两个 P 帧之间的距离。
一个 I 帧所占用的字节数大于一个 P 帧,一个 P 帧所占用的字节数大于一个 B 帧。所以在码率不变的前提下,GOP 值越大, P、B 帧的数量会越多,平均每个 I、P、B 帧所占用的字节数就越多,也就更容易获取较好的图像质量;Reference 越大,B 帧的数量越多,同理也更容易获得较好的图像质量。
简而言之:
视频播放器播放一个互联网上的视频文件(本地文件),需要经过以下几个步骤:
将流媒体协议的数据,解析为标准的相应的封装格式数据。视音频在网络上传播的时候,常常采用各种流媒体协议,例如 HTTP,RTMP,或是 MMS 等等。
这些协议在传输视音频数据的同时,也会传输一些信令数据。
这些信令数据包括对播放的控制(播放,暂停,停止),或者对网络状态的描述等。 解协议的过程中会去除掉信令数据而只保留视音频数据。例如,采用 RTMP 协议传输的数据,经过解协议操作后,输出 FLV 格式的数据。
将输入的封装格式的数据,分离成为音频流压缩编码数据和视频流压缩编码数据。封装格式种类很多,例如 MP4,MKV, RMVB,TS,FLV,AVI 等等,它的作用就是将已经压缩编码的视频数据和音频数据按照一定的格式放到一起。
将视频/音频压缩编码数据,解码成为非压缩的视频/音频原始数据。
音频的压缩编码标准包含 AAC,MP3,AC-3 等等,视频的压缩编码标准则包含 H.264,MPEG2,VC-1 等等。
解码是整个系统中最重要也是最复杂的一个环节。
通过解码,压缩编码的视频数据输出成为非压缩的颜色数据,例如 YUV420P,RGB 等等;压缩编码的音频数据输出成为非压缩的音频抽样数据,例如 PCM 数据。
几乎所有的视频播放器,如 VLC、MPlayer、Xine,包括 DirectShow,在播放视频的原理和架构上都是非常相似的,理解这个对理解 VLC 的源码会有事半功倍的效果。
大致的来说, 播放一个视频分为 4 个步骤:
拿播放一个 UDP 组播的 MPEG TS 流来说吧,access 部分负责从网络接收组播流,放到 VLC 的内存缓冲区中,access 模块关注 IP 协议,如是否 IPv6、组播地址、组播协议、端口等信息;如果检测出来是 RTP 协议(RTP 协议在 UDP 头部简单得加上了固定 12 个字节的信息),还要分析 RTP 头部信息。这部分可以参看 VLC 源码 /modules/access/udp.c 。在同目录下还可以看到大量的 access 模块,如 file、http、dvd、ftp、smb、tcp、dshow、mms、v4l…等等
而 demux 部分首先要解析 TS 流的信息。TS 格式是 MPEG2 协议的一部分,概括地说,TS 通常是固定 188 字节的一个 packet,一个 TS 流可以包含多个 program(节目),一个program 又可以包含多个视频、音频、和文字信息的 ES 流;每个 ES 流会有不同的 PID 标示。而又为了可以分析这些 ES 流,TS 有一些固定的 PID 用来间隔发送 program 和 es 流信息的表格: PAT 和 PMT 表。 关于 TS 格式的详细信息可以去 google 一下。
VLC 专门做了一个独立的库 libdvbpsi 来解析和编码 TS 流,而调用它的代码可以参见 VLC 源码 /modules/demux/ts.c。
其实之所以需要 demux,是因为音视频在制作的时候实际上都是独立编码的,得到的是分开的数据,为了传输方便必须要用某种方式合起来,这就有了各种封装格式也就有了 demux。
demux 分解出来的音频和视频流分别送往音频解码器和视频解码器。因为原始的音视频都是占用大量空间,而且冗余度较高的数据,通常在制作的时候就会进行某种压缩。这就是我们熟知的音视频编码格式,包括 MPEG1(VCD)、MPEG2(DVD)、 MPEG4、H.264、rmvb 等等。音视频解码器的作用就是把这些压缩了的数据还原成原始的音视频数据。VLC 解码 MPEG2 使用了一个独立的库 libmpeg2,调用它的源文件是 /modules/codec/libmpeg2.c。VLC 关于编解码的模块都放在 /modules/codec 目录下, 其中包括著名的庞大的 ffmpeg。
解码器,例如视频解码器输出的是一张一张的类似位图格式的图像,但是要让人从屏幕看得到, 还需要一个视频输出的模块。当然可以像一个 Win32 窗口程序那样直接把图像画到窗口 DC 上——VLC 的一个输出模块 WinGDI 就是这么干的,但是通常这太慢了,而且消耗大量的 CPU。在 Windows 下比较好的办法是用 DirectX 的接口,会自动调用显卡的加速功能。
视频转码是指将已经压缩编码的视频码流转换成另一个视频码流,以适应不同的网络带宽、不同的终端处理能力和不同的用户需求。
转码本质上是一个先解码,再编码的过程,因此转换前后的码流可能遵循相同的视频编码标准, 也可能不遵循相同的视频编码标准。
视频转码技术使用的目的不同,其实现的手段也各不相同。大致上可以分为两类:
不同编码格式之间的数据转码,指通过转码方法改变视频数据的编码格式。通常这种数据转码会改变视频数据的现有码流和分辨率。
例如我们可以将基于 MPEG-2 格式的视频数据转换为 DV 、MPEG-4 或其它编码格式,同时根据其转码目的,指定转码产生视频数据的码流和分辨率。
这种转码方式设计的算法较为复杂,其实质上是一个重新编码的过程,涉及的算法复杂度和系统开销,是由转码所需图像质量要求及转码前后两种编码方式的相关度所决定的。
相同编码格式的数据转码,指不改变压缩格式,只通过转码手段改变其码流或头文件信息。
根据其使用目的, 可分为改变码流和不改变码流两种。
如我们可以将 MPEG-2 全 I 帧 50Mbps 码流的视频数据转码为 MPEG-2 IBBP 帧 8Mbps 码流的视频数据,直接用于播出服务器用于播出。
非线性编辑是借助计算机来进行数字化制作,几乎所有的工作都在计算机里完成,不再需要那么多的外部设备,对素材的调用也是瞬间实现,不用反反复复在磁带上寻找,突破单一的时间顺序编辑限制,可以按各种顺序排列,具有快捷简便、随机的特性。
非线性编辑只要上传一次就可以多次的编辑,信号质量始终不会变低,所以节省了设备、人力,提高了效率。
- 传统线性视频编辑是按照信息记录顺序,从磁带中重放视频数据来进行编辑,需要较多的外部设备,如放像机、录像机、特技发生器、字幕机,工作流程十分复杂。
- 非线性编辑系统是指把输入的各种视音频信号进行 A/D(模/数)转换,采用数字压缩技术将其存入计算机硬盘中。
- 非线性编辑没有采用磁带,而是使用硬盘作为存储介质,记录数字化的视音频信号,由于硬盘可以满足在 1/25s(PAL) 内完成任意一副画面的随机读取和存储,因此可以实现视音频编辑的非线性。
我的qq:2442391036,欢迎交流!