目录

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 的值一定大于图像的宽度值,就像下图所示:

https://i-blog.csdnimg.cn/blog_migrate/c5c263bddc859af3ba8fdc49c09b06f1.png

比如分辨率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的排列方式。

https://i-blog.csdnimg.cn/blog_migrate/07bbe9aac6da182689f47fab047a4cd2.png

YUV :与我们熟知RGB类似,YUV也是一种颜色编码方法,它是指将 亮度 参量

(Y:Luminance或Luma)和 色度 参量(UV:Chrominance或Chroma)分开进行表示的像素编码格式。

https://i-blog.csdnimg.cn/blog_migrate/bf952252930db0d85dc6f0ad1f1b17fe.png

这样分开的好处就是不但可以 避免相互干扰 ,没有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 这几种常用的类型。

https://i-blog.csdnimg.cn/blog_migrate/22ff3771bf91f467221244231dba4647.png

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。

https://i-blog.csdnimg.cn/blog_migrate/a05056443d06666b339e0e807ce8844b.png

为什么解码出错显示 绿屏 ?

因为解码失败时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分量有值 所以为绿色。