本文中涉及到的一些编码,图像等的具体处理在代码上的体现可查看:[总结]视音频编解码技术零基础学习方法
基本概念-颜色
RGB和YUV:图像常见的两类数字化表达。
RGB是基于三原色原理,对红绿蓝三个颜色通道叠加得到各式各样的颜色。主要用来在显示器上显示(渲染)。
常见的RGB格式:
RGB 1:2色,每个像素用1位表示
RGB 4:16色,每个像素用4位表示
RGB 8:256色,每个像素用8位表示
RGB 565:每个像素16位表示,R5位 G6位 B5位
RGB 16/555:每个像素16位表示,R5位 G5位 B5位 剩下1位不用
RGB 24:每个像素24位表示,R8位 G8位 B8位
RGB 32:每个像素32位表示,R8位 G8位 B8位 剩下8位不用
-
ARGB 32:每个像素32位表示,R8位 G8位 B8位 剩下8位 标识 Alpha通道。
一个像素所使用的位数不同,显示出来的色彩丰富度不同,位数越大,色彩越丰富。
YUV是另一种编码方式,Y表示明亮度,U表示色度,V表示浓度。描述影像的色彩及饱和度,用于指定像素的颜色。主要用于食品信号的压缩、传输和存储。
YCbCr:YUV的另外一种表示YUV是信号领域,YCbCr是数字图像领域。Cr红色分量信号,Cb蓝色分量信号,Y除了g绿色分量信号,还叠加了亮度信号。
常见的YUV/YCbCr格式的采样方法有:
4:4:4 、 4;2:2 、 4:2:0 、 4:1:1。
其中4:2:0并不意味只有Y,Cb没有Cr,它指的是对每行扫描线来说只有一种色度分量以2:1的抽样率存储。
YUV的存储格式:
平面格式:先连续存储所有像素点的Y分量,然后存储U分量,最后是V分量。
打包模式:每个像素点的YUV分量连续交替存储.
RGB和YUV的转化。
RGB转YUV:
Y = (0.257 * R) + (0.504 * G) + (0.098 * B) + 16
Cr = V = (0.439 * R) - (0.368 * G) - (0.071 * B) + 128
Cb = U = -( 0.148 * R) - (0.291 * G) + (0.439 * B) + 128
YUV转RGB:
B = 1.164(Y - 16) + 2.018(U - 128)
G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
R = 1.164(Y - 16) + 1.596(V - 128)
RGB用来显示,YUV用来传输
基本概念-视频
视频:连续的图像变化每秒超过24帧(frame)画面以上时,看上去就是平滑连续的视觉效果,这样连续的画面叫做视频。
帧(Frame):影像中常用的最小单位,一帧就是一副静止的画面。
帧速率(FPS):每秒说传输的图片个数,或者可以理解为处理器每秒刷新的次数。FPS越高,画面越流畅。
转码:实质是一种针对特定的音视频格式内容压缩成另一种视频格式的方式。
- (原视频 -- 解码 -- 像素数据 -- 编码 -- 目标视频)
- (原音频 -- 解码 -- 音频数据 -- 编码 -- 目标音频)
为什么要编码?
一段网络上的视频信号数字化后占用大量的存储空间和数据带宽,比如高清视频的码率往往可以达到200Mb/s、120分钟的电影将占到180G以上,通过编码后,下载的电影也就2G-8G。
为什么要解码?
编码过的内容无法直接使用,使用(观看)时必须解压缩,还原为原始的信号(比如视频中某个点的颜色等)
采样频率:录音设备在一秒钟内对声音信号的采样次数,它用赫兹(Hz)来表示,比如44.1KHz采样率的声音就是要花费44000个数据点来描述1秒钟的声音波形。原则上采样率越高,声音质量越好。
常见的CD采样频率是44.1KHz ,因为人能够感受到的最高频率是20KHz
码率/比特率:1秒内传输的比特数
压缩:使用更少的数据来表达更多的信息。 - 有损压缩:通过删除不必要或者不重要的内容减少数据量。
- 无损压缩:压缩过程中不丢失任何信息。
视频的构成
一个完整的视频文件是由音频和视频两部分组成的,而音频和视频又是由封装格式和编码格式构成的
通常我们看见的视频文件的后缀名就是封装格式比如MP4,3GP,RMVB,MOV。这些封装格式里边还有一层编码文件。常见的视频编码格式有H.264,mpeg-4,常见的音频编码格式有MP3、AAC。
视频编码(压缩)方式/编码(压缩)原理/概念
视频数据有极强的相关性,帧与帧之间有大量冗余信息,压缩的本质就是去除这些冗余信息。
压缩的方向:
- 空间冗余,视频的背景和整体颜色相近并且平稳变化,可以利用帧内编码进行压缩;(无损)
- 时间冗余,两个视频帧之间具有强相关性,利用运动估计和运动补偿进行帧间压缩;(无损)
- 运动补偿:通过先前的局部图像来预测,补偿当前的局部图像;
- 运动表示:不同区域的图像需要使用不同的运动矢量来描述运动信息;
- 运动估计:从视频序列中抽取运动信息的一整套技术。
- 结构冗余,图像内部存在相似性,通过这种关系可以进行分形编码;
- 编码冗余,出现概率大的颜色编码长度短,概率小的颜色编码长度长;(可变长度编码)
- 视觉冗余,利用人眼对亮度和色度的敏感度不同,在编码时进行数据压缩;(有损压缩)
GOP概念:它代表两个I帧之间形成的一组连续的图像帧。
通常在编码器设置参数时,必须会设置一个gop_size的值,其实就是代表2个I帧之间的帧数目。在一个GOP组中容量最大的就是I帧,所以相对而言,gop_size设置的越大,整个视频画面质量就会越好。但是解码端必须从接受的第一个I帧开始才可以正确解码出原始图像,否则无法正确解码。
IPB帧:
简略: - I帧是关键帧,解码时只需要本帧数据;
- P帧是参考帧,表示这一帧与前一个关键帧(或P帧)的差别;
- B帧是双向参考帧,表示本帧与前后帧的差别;(B帧压缩率高,解码复杂,直播中较少用)
- IDR帧是第一个I帧,为的是和其他I帧区别开,方便控制编码和解码;
编码角度来理解IPB: - I帧通过视频压缩算法解压成一张单独的完整视频画面,I帧去掉的是视频帧在空间维度上的冗余信息;
- P帧需要参考其前面的一个I帧或者P帧来解码成一张完整的视频画面;
- B帧需要参考其前一个I帧或者P帧,以及后面的一个P帧来生成一张完整的视频画面,所以P帧和B帧去掉的是视频帧在时间维度上的冗余信息。
DTS:Decode Timestamp 解码时间戳。用于解码阶段进行视频的同步和输出。
PTS:Presentation Timestamp 显示时间戳
硬编码:使用GPU计算,性能高 VideoToolBox、AudioToolBox。但是特性支持有限,而且压缩率一般偏低
软编码:使用CPU来进行编码计算,实现简单直接,升级容易,但是CPU负载重。压缩率比较高,而且支持的H264特性也会比硬编码多很多,相对来说比较可控。
视频:使用ffmpeg,x264算法吧视频原始数据YUV/RGB编码成H264
-
音频:使用fdk_aac将音频数据PCM转换成AAC。
在优势方面,软件编码兼容性好,能解码所有的视频格式文件,画质清晰、画面精致,速度较快。而硬件编码的优势在于它的编码速度非常快且效率极高,由于GPU承担起了编码的重担,因此硬编码对CPU的占用率低,就算长时间高清录制视频手机也不会发烫降频。
在劣势方面,软件编码的CPU占用率高,一些性能比较差的手机可能会因CPU发热而降频、卡顿,无法流畅录制、播放视频,同时使用软件编码的方式可能会让软件包体变大,手机内存占用率变高。而硬件编码的确定就更明显,在某些智能手机上,由于机型区别,采取硬件编码的方式可能会出现兼容性上的问题,还有硬件编码画面不够精细的问题一直都很难解决。
播放一个网络上的视频需要的步骤
1.解协议:将流媒体协议的数据,解析为标准的响应的封装格式数据。
2.解封装:将输入的封装格式的数据,分离成音频流压缩编码数据和视频流压缩编码数据。
3.解码:就是将视频/音频压缩编码数据,解码成为非压缩的视频/音频原始数据。
- 把压缩编码的视频数据,输出成为非压缩的颜色数据,例如YUV420P,RGB等等;
-
把压缩编码的音频数据,输出成为非压缩的音频抽样数据,例如PCM数据。
4.音视频同步:根据封装模块处理过程中获取的参数信息,同步解码出来的视频和音频数据,并将其发送到系统的显卡和声卡播放出来。