C音视频开发学习-什么是视频
C++音视频开发学习 — 什么是视频?
图像
视频由图像组成,图像中的基础概念有:
1、像素 :像素是一个图片的基本单位,pix是英语单词picture的简写,加上英语单词“元素element”,就得到了“pixel”,简称px,所以“像素”有“图像元素”之意。例如2500×2000的照片就是指横向有2500个像素点,竖向有2000个像素点,总共是500万个像素,也俗称500万像素照片。
2、分辨率 :是指图像的大小或尺寸。比如1920x1080。常见的分辨率: 360P (640x360)、 720P (1280x720)、1080P(1920x1080)、 4K (3840x2160)、8K(7680x4320) 。
1080 和 720 其实是 指垂直像素数 ,分辨率除去垂直像素,还需要考虑到水平像
素数。按照 16:9 (宽 : 高) 的比例计算,720p 的水平像素数为 720 ÷ 9 × 16 = 1280,总
计像素为921600像素即大约为 92 万像素。1080p 具有 1920 个水平像素,总计2073600
像素即约 200 万像素,是 720p 的两倍多。
像素越多视频就越清晰,所以 1080p 比 720p 的视频更加清晰。图像的分辨率越高,图
像就越清晰。
3、位深 :是指在记录数字图像的颜色时,计算机实际上是用每个像素需要的位深来表示的。比如红色分量用8bit。我们看到的彩色图片,都有三个通道,分别为红®、绿(G)、蓝(B)通道。(如果需要透明度则还有alpha分量)
通常每个通道用8bit表示,8bit能表示256种颜色,所以可以组成256 256 256=16,777,216 = 1677万种颜色。这里的 8bit 就是位深。
每个通道的位深越大,能够表示的颜色值就越大,比如现在高端电视说的10bit色彩,即是每个通道用 10bit 表示,每个通道有1024种颜色。1024 1024 1024约为10,7374万色=10亿色, 是8bit的64倍。
4、帧率 :在1秒钟时间里传输的图片的帧数,也可以理解为图形处理器每秒钟能够刷新几次。比如25fps表示一秒有25张图片。
帧率即== FPS==(每秒有多少帧画面),经常玩游戏的同学应该会对这个词很熟悉。我们玩游戏时,FPS 帧率越高就代表游戏画面越流畅,越低则越卡顿。视频也是如此。由于视觉图像在视网膜的暂时停留,一般图像帧率能达到 24帧 ,我们就认为图像是连续动态的。
电影帧率一般是 24fps(帧每秒);电视剧一般是25fps;监控行业常用 25fps;音视频通话常用15fps;帧率越高,画面越流畅,需要的设备性能也越高。
5、码率 :视频文件在单位时间内使用的数据流量。比如1Mbps。
大多数情况下码率越高 分辨率越高,也就越清晰。但模糊的视频文件大小(码率)也
可以很大,分辨率小的视频文件可能也比分辨率大的视频文件清晰。
对于同一个原始图像源的时候,同样的编码算法,则码率越高,图像的失真就会越小,
视频画面就会越清晰。
6、Stride :指在内存中每行像素所占的空间。为了实现内存对齐每行像素在
内存中所占的空间并不一定是图像的宽度。
Stride 就是这些扩展内容的名称,Stride 也被称作 Pitch,如果图像的每一行像素末尾拥
有扩展内容,Stride 的值一定大于图像的宽度值,就像下图所示:
比如分辨率638x480的RGB24图像,我们在内存处理的时候如果要以16字节对齐,
则638 *3/16=119.625不能整除,因此不能16字节对齐,我们需要在每行尾部填充6
个字节。就是(638+2 = 640), 640* 3/16=120。此时该图片的stride为640*3 = 1920字节。
RGB与YUV
RGB:红R、绿G、蓝B三基色。
通常的图像像素是按RGB顺序进行排列,但有些图像处理要转成其他顺序,比如 OpenCV 经常转成BGR的排列方式。
YUV :与我们熟知RGB类似,YUV也是一种颜色编码方法,它是指将 亮度 参量
(Y:Luminance或Luma)和 色度 参量(UV:Chrominance或Chroma)分开进行表示的像素编码格式。
这样分开的好处就是不但可以 避免相互干扰 ,没有UV信息一样可以显示完整的图像,因而解决了 彩色 电视与 黑白 电视的兼容问题;还可以降低色度的采样率而不会对图像质量影响太大, 降低 了视屏信号传输时对==频宽(带宽)==的要求。Y Y共用一组UV分量。
YUV是一个比较笼统地说法,针对它的具体排列方式,可以分为很多种具体的格式:
打包(packed)格式 :将每个像素点的Y、U、V分量交叉排列并以像素点为单元连续的存放在同一数组中,通常几个相邻的像素组成一个宏像素(macro-pixel)。
YUV YUV YUV YUV YUV YUV
YUV YUV YUV YUV YUV YUV
YUV YUV YUV YUV YUV YUV
YUV YUV YUV YUV YUV YUV
平面(planar)格式 :使用三个数组分开连续的存放Y、U、V三个分量,即Y、U、V分别存放在各自的数组中。
YYY YYY YYY
YYY YYY YYY
UUU UUU UUU
UUU UUU UUU
VVV VVV VVV
VVV VVV VVV
YUV的采样表示法 :YUV采用A:B:C表示法来描述Y,U,V采样频率比例,下图中黑点表示采样像素点Y分量,空心圆表示采样像素点的UV分量。主要分为 YUV 4:4:4、YUV 4:2:2、YUV 4:2:0 这几种常用的类型。
4:4:4 表示色度频道没有下采样,即一个Y分量对应着一个U分量和一个V分量。
4:2:2 表示 2:1 的水平下采样,没有垂直下采样,每两个Y分量共用一个U分量和一个V分量。
4:2:0 表示 2:1 的水平下采样,2:1 的垂直下采样,每四个Y分量共用一个U分量和一个V分量。
以每个分量数据存储在一个char(或byte)中为例描述YUV的数据存储方式。4:4:4格式,4:2:2格式,4:2:0格式。
I444-YUV444P 格式, 对应Ffmpeg像素表示AV_PIX_FMT_YUV444P // planar YUV
4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples),类型为planar格式(4+4+4)/4 = 3字节。
I422-YUV422P 格式,对应Ffmpeg像素表示AV_PIX_FMT_YUV422P, ///< planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples),类型为planar格式(4+2+2)/4 = 2字节。
I420-YUV420P 格式,对应Ffmpeg像素表示AV_PIX_FMT_YUV420P, ///< planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples),类型为planar格式(4+1+1)/4 = 1.5字节。
RBG与YUV的转换
通常情况下RGB和YUV直接的相互转换都是调用接口实现,比如Ffmpeg的swscale或者libyuv等库。
主要转换标准是 BT601 和 BT709。
YUV(256 级别) 可以从8位 RGB 直接计算:
Y = 0.299 R + 0.587 G + 0.114 *B;
U = -0.169* R - 0.331*G + 0.5 *B ;
V = 0.5 R - 0.419 G - 0.081* B;
8bit位深的情况下
TV range是16-235(Y)、16-240(UV) , 也叫Limited Range
PC range是0-255,也叫Full Range
而RGB没有range之分,全是0-255
从YUV 转到 RGB 如果值小于0要取0,如果大于255要取255。
为什么解码出错显示 绿屏 ?
因为解码失败时YUV分量都填为0值,然后根据公式:
R = 1.402 * (-128) = -126.598
G = -0.34414*(-128) - 0.71414*(-128) = 44.04992 + 91.40992 = 135.45984
B = 1.772 * (-128) = -126.228
RGB 值范围为[0,255], 所以最终的值为:
R = 0
G = 135.45984
B = 0
此时 只有G分量有值 所以为绿色。