音视频ffmpeg笔记(二)

绘制YUV数据

YUV格式

YUV格式:一种颜色编码方式,可以转化成我们常用的RGB色值。
Y明亮度,灰度值。 U是色度,V是浓度,UV描述颜色和饱和度。

主要用于电视,亮度信息Y与色彩信息UV分离,没有UV信息就算黑白电视效果。

Y代表亮度,UV代表色值,Y可以显示一张完整的黑白图像。这样的设计解决了黑白电视和彩色电视的兼容,并且YUV不像RGB那样要求三个独立的视频信号,同时传输,所以用YUV方式传送,占用极少的频宽。

YUV420

Y:U:V=4:1:1,绝大多数视频是YUV420格式的。如果不是就先转化为YUV420格式然后再渲染

FFmpeg中的YUV数据

FFmpeg解码出来的视频YUV数据是存储在AVFrame中的data里面

Y分量:  frame->data[0]

U分量:  frame->data[1]

V分量:  frame->data[2]

图像压缩编码标准

1、  JPEG:采用一种特殊的有损压缩算法,将不易被人眼察觉的颜色有损压缩,从而达到较大的压缩比(可达到2:1甚至40:1),所以JPEG格式的文件尺寸较小,下载速度快,是互联网上最广泛使用的格式。颜色质量高达24bit(16700000种颜色)。

2、  GIF:最大的特点是,不仅可以是一张图片,也可以是动画,并且支持透明背景图像,适用于多种操作系统,“体型”很小,网上很多小动画都是GIF格式。但是其色域不太广,只支持(8bit)256种颜色。

3、  PNG:和JPEG一样,能够支持24bit色。同GIF调色板一样,PNG也能将颜色定义为透明,因此,可以避免标志干扰背景。与JPEG最大的不同是,它在压缩图像时不会造成质量上的损失,相应的文件体积也大于GIF和JPEG。PNG具有一项领先于GIF和JPEG的附加功能,这就是在图像中能够保存附件信息,如有关作者的信息等。

 

I帧,P帧,B帧,视频码率,帧率和分辨率 区别和理解

I帧表示关键帧,一帧画面的完整保留;解码时只需要本帧数据就可以完成,因为包含完整画面。

P帧表示的是这一帧跟之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。(也就是差别帧,P帧没有完整画面数据,只有与前一帧的画面差别的数据)

B帧是双向差别帧,也就是B帧记录的是本帧与前后帧的差别(具体比较复杂,有4种情况),换言之,要解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。B帧压缩率高,但是解码时比较占用CPU。

电影很多都采用了B帧,因为B帧记录的是前后帧的差别,比P帧能节约更多的空间,但这样一来,文件小了,解码器就麻烦了,因为在解码时,不仅要用之前缓存的画面,还要知道下一个I或者P的画面(也就是说要预读预解码),而且,B帧不能简单地丢掉,因为B帧其实也包含了画面信息,如果简单丢掉,并用之前的画面简单重复,就会造成画面卡(其实就是丢帧了),并且由于网络上的电影为了节约空间,往往使用相当多的B帧,B帧用的多,对不支持B帧的播放器就造成更大的困扰,画面也就越卡。

一般平均来说,I的压缩率是7(跟JPG差不多),P是20,B可以达到50,可见使用B帧能节省大量空间,节省出来的空间可以用来保存多一些I帧,这样在相同码率下,可以提供更好的画质。

DTS、PTS 的概念

DTS(Decoding Time Stamp):即解码时间戳,这个时间戳的意义在于告诉播放器该在什么时候解码这一帧的数据。

PTS(Presentation Time Stamp):即显示时间戳,这个时间戳用来告诉播放器该在什么时候显示这一帧的数据。

 

 

IDR帧和I帧

IDR帧和I帧:首个I帧叫做 IDR 图像(立即刷新图像),IDR 图像都是 I 帧图像,不过I帧不一定是IDR图像。H.264 引入 IDR 图像是为了解码的重同步,当解码器解码到 IDR 图像时,立即将参考帧队列清空(DPB,DecodedPictureBuffer 参考帧列表),将已解码的数据全部输出或抛弃,重新查找参数集,开始一个新的序列。这样,如果前一个序列出现重大错误,在这里可以获得重新同步的机会。IDR图像之后的图像永远不会使用IDR之前的图像的数据来解码。

H265和H264 

同样的画质和同样的码率下,理论上H.265比H.264 所占用的存储空间少50%;如果存储空间一样大,一样的码率下,理论上H.265比H2.64 画质要高出30%~40%,但是因为部分专利费用太高,计算复杂度,编码要求的硬件性能高。普及难度直线上升。

分辨率

分辨率常用的有: 
720*480(标清480p) 
1280*720(高清720p) 
1920*1080(全高清1080p, 1920*2 * 1080*2 = 4k) 
3840×2160(八百万像素的超高清4k,往上再4倍就是8k超高清) 
其实含480p以下为标清,480p以上为高清,经典的有720p、1080i、1080p,1080p又称全高清,1080p以上都为超清。(i隔行扫描多用于电视机信号,p逐行扫描) 
帧率: 
在1秒钟时间里传输的图片的帧数,影响画面流畅度,常说的24帧电影、在游戏上的FPS,都是这个概念,通常手机上20帧左右即可。 
ps:Gop是指多少秒一个I帧。 
码率: 
右键看一个视频的属性,详细里有一个总比特率,计算方式是:

【码率】(kbps)=【文件大小】(字节 )X8 /【时间】(秒)

码率单位是kbps即千位每秒。也就是取样率(和音频的采样率有区别,采样率单位是Hz,表示每秒采样次数),单位时间内取样率越大,精度就越高,处理出来的文件就越接近原始文件,但是文件体积与取样率是成正比的,所以几乎所有的编码格式重视的都是如何用最低的码率达到最少的失真。码率越高越清晰,反之则画面粗糙而多马赛克,1080P不一定比720P清晰,打开看码率对比最实际~

带宽、码流、在线人数,之间的关系

带宽 / (码流 * 8) = 同时在线人数 
文件大小 = 时间×码率/8 
一个视频文件的大小为5.86M,播放时长为3分7秒: 
1:该文件对应的码流就是       5.86 * 1024 * 1024 * 8 / (3 * 60 + 7) =262872.95657754bps 
2:10M独享带宽能支撑的同时在线人数      10* 1024 * 1024 / 262872.95657754 =39.889078498294 
3:支撑1000人同时在线的系统最少需要的带宽数为     262872* 1000 / (1024 * 1024) = 250.69427490234M

场频:画面刷新次数。 
行频:屏幕的水平扫描频率,以Hz为单位。它越大就意味着显示器可以提供的分辨率越高,稳定性越好。

行频 = height(垂直分辨率) * 1.04~1.08 * 场频

 

猜你喜欢

转载自blog.csdn.net/panjunnn/article/details/111587335