数字音视频
基础
1.交叉编译
在一种平台上编译,编译出来的程序,是放到别的平台上运行
即编译的环境,和运行的环境,不一样,属于交叉的,此所谓cross
交叉编译详解
音频
声波的三要素:
- 频率
- 响度
- 音色
频率代表音阶的高低,振幅代表响度,波形代表音色
将模拟信号数字化:
-
采样:采样频率一般为
44.1kHz
,表示1秒会采样44100次 -
量化:指在幅度轴上对信号数字化
比如用16比特的二进制来表示声音的一个采样,16比特表示的范围是
[-32768, 32767]
,共有65536
个可能的取值,所以音频信号在幅度上分成了65536
层 -
编码:即按照一定的格式记录采样和量化后的数字数据
通常所说的音频的裸数据格式就是脉冲编码调制
(Pulse Code Modulation, PCM)
描述一段PCM数据一般需要以下的几个概念:
- 量化格式(sampleFormat)
- 采样率(sampleRate)
- 声道数(channel)
以CD的音质为例,量化格式为16比特(2字节), 采样率为44100,声道数为2
对于声音格式,使用数据比特率来描述它的大小,即1秒时间内的比特数目,它用于衡量音频数据单位时间内的容量大小。对于如上的CD音质的数据,比特率为:
44100 * 16 * 2 = 1378.125kbps
在1分钟内,占据的存储空间:
1378.125 * 60 / 8 / 1024 = 10.09MB
如果要在网络中实时在线传输的话,就需要进行压缩编码。压缩算法包括:
- 有损压缩 - 解压后的数据不能完全恢复
- 无损压缩 - 解压后的数据可以完全恢复
常见的压缩编码格式:
1.WAV编码
2.MP3编码
3.AAC编码
AAC是H.264标准相应的音频处理格式,目前已成为音频流和下载的音频资源最主流的编码方式。
这个格式比MP3格式有显著提升,可以在低比特率的前提下提供更高质量的音频,是在Web上发布和传播音频格式中最为理想的
特点:在小于128Kbit/s的码率下表现优异,并且多用于视频中的音频编码
4.Ogg编码
声音的三要素 - 响度(loudness),音高(pitch),音色(timbre)
MIDI(Musical Instrument Digital Interface)乐器数字接口,是20世纪80年代为解决电声乐器之间的同行问题而提出的
均衡效果器又称为均衡器(Equalizer),其最大的作用就是决定声音的远近层次。均衡效果器具有美化声音的作用,即调整音色
视频
屏幕分辨率:例如,屏幕分辨率是1280×720,也就是说设备屏幕的水平方向上有1280个像素点,垂直方向上有720个像素点。每个像素点由三个子像素点组成。当要显示某篇文字或者某幅图像时,就会把这幅图像的每一个像素点的RGB通道分别对应的屏幕位置上的子像素点绘制到屏幕上
图像的数值表示:
1.RGB表示
一个像素点的RGB的表示:
- 浮点表示:取值范围0.0~1.0,例如OpenGL ES
- 整数表示:取值范围
0~255
或者00~FF
,8个比特表示一个子像素点,32个比特表示一个像素,这个类似于
RGBA_8888
数据格式
2.YUV表示
YUV,分为三个分量,“Y”表示明亮度(Luminance或Luma),也就是灰度值;而“U”和“V” 表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。
与我们熟知的RGB类似,YUV也是一种颜色编码方法,主要用于电视系统以及模拟视频领域,它将亮度信息(Y)与色彩信息(UV)分离,没有UV信息一样可以显示完整的图像,只不过是黑白的,这样的设计很好地解决了彩色电视机与黑白电视的兼容问题。并且,YUV不像RGB那样要求三个独立的视频信号同时传输,所以用YUV方式传送占用极少的频宽。
图像中的Y’, U,和V组成,如下的例子:
常用的YUV格式
为节省带宽起见,大多数YUV格式平均使用的每像素位数都少于24位。主要的抽样(subsample)格式有YCbCr 4:2:0、YCbCr 4:2:2、YCbCr 4:1:1和YCbCr 4:4:4。YUV的表示法称为A:B:C表示法:
- 4:4:4表示完全取样。
- 4:2:2表示2:1的水平取样,垂直完全采样。
- 4:2:0表示2:1的水平取样,垂直2:1采样。
- 4:1:1表示4:1的水平取样,垂直完全采样。
最常用Y:UV记录的比重通常1:1或2:1,DVD-Video是以YUV 4:2:0的方式记录,也就是我们俗称的I420,YUV4:2:0并不是说只有U(即Cb), V(即Cr)一定为0,而是指U:V互相援引,时见时隐,也就是说对于每一个行,只有一个U或者V分量,如果一行是4:2:0的话,下一行就是4:0:2,再下一行是4:2:0…以此类推。至于其他常见的YUV格式有YUY2、YUYV、YVYU、UYVY、AYUV、Y41P、Y411、Y211、IF09、IYUV、YV12、YVU9、YUV411、YUV420等。
可参考:
相较于RGB,以计算一帧为1280×720 的视频帧,用YUV420P的格式来表示,其数据大小为:
1280 * 720 *1 + 1280 * 720 * 0.5 = 1.318MB
如果fps为24(每秒24帧),90分钟的电影,如果用YUV420P的数据格式来表示的话,其大小是:
1.318MB * 24fps * 90min * 60s = 166.8GB
所以使用这种方式来存储电影是不行的,更别说进行流媒体播放了
该怎么解决呢?要进行视频编码
YUV和RGB转化
凡是渲染到屏幕上的东西,都要转为RGB的表示形式
比较典型的场景是,iOS平台中使用摄像头采集出YUV数据之后,上传显卡称为一个文理ID,这个时候就需要YUV到RGB的转换
视频的编码方式
IPB帧
- I帧 - I帧可以通过视频解压缩算法解压成一张单独的完整视频画面,所以I帧去掉的是视频帧在空间上维度上的冗余信息
- P帧 - P帧需要参考前面的一个I帧或者P帧来解码一张完整的视频画面
- B帧 - B帧需要参考其前一个I帧或者P帧及其后面的一个P帧来生成一张完整的视频画面
PTS与DTS
- DTS - Decoding Time Stamp,主要用于视频的解码
- PTS - Presentation Time Stamp,主要用于在解码阶段进行视频的同步和输出
编解码
编码过程:RGB—>YUV—>H.264. 只有YUV才能编码成264。 为啥需要编码,因为一张没有压缩过的图片,数据量太大了。你网络带宽有限。你自己可以计算下,一张640x480的图片,每秒30帧。 每秒的数据量就是 640x480x3x30=27648000 = 3.2MB字节. 一张VGA的图片,每秒数据3.2MB字节. 你能传出去吗? 国内上行平均是512kb=64KB每秒,所以你图片的数据量太大了。 局域网勉强可以传。 所以我们需要把图像编码,压缩以后再传出去。所以才有了H.264这种压缩算法。
解码过程: H.264->YUV-RGB. 我们从网络中获取到的H.264数据,是压缩过的,不能直接显示的。所以要解码,解压缩。进行图像还原。 计算机显卡只能显示RGB 3原色。所以我们要将YUV转为RGB 才能给计算机显卡显示为一张图片。