数字音视频

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014084081/article/details/82912791

数字音视频

基础

1.交叉编译

在一种平台上编译,编译出来的程序,是放到别的平台上运行
即编译的环境,和运行的环境,不一样,属于交叉的,此所谓cross
交叉编译详解

音频

声波的三要素:

频率代表音阶的高低,振幅代表响度,波形代表音色

将模拟信号数字化:

  • 采样:采样频率一般为44.1kHz,表示1秒会采样44100次

  • 量化:指在幅度轴上对信号数字化

    比如用16比特的二进制来表示声音的一个采样,16比特表示的范围是[-32768, 32767],共有65536个可能的取值,所以音频信号在幅度上分成了65536

  • 编码:即按照一定的格式记录采样和量化后的数字数据

    通常所说的音频的裸数据格式就是脉冲编码调制(Pulse Code Modulation, PCM)

描述一段PCM数据一般需要以下的几个概念:

以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编码

视频

屏幕分辨率:例如,屏幕分辨率是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格式
为节省带宽起见,大多数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的转换

视频的编码方式

H.264码流以及H.264编解码的基本概念

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 才能给计算机显卡显示为一张图片。

猜你喜欢

转载自blog.csdn.net/u014084081/article/details/82912791