视频基础教材_第1页
视频基础教材_第2页
视频基础教材_第3页
视频基础教材_第4页
视频基础教材_第5页
已阅读5页,还剩21页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目录

—:视频入门................................................................1

(-)视频定义(什么是视频).............................................1

(-)图像................................................................1

(二)屏幕显ZF器.........................................................2

(四)码流的计算.........................................................3

(五)图像的显示(图像和显示器分辨率不一致情况)........................3

二:YUV了解...............................................................4

(-)什么是YUV(有了RGB图像之后,为什么还需要YUV?)..............................4

(-)YUV4:2:0存储格式................................................7

(三)YUV命令行采集数据.................................................8

补充:使用摄像头(借到了)..............................................12

三:H264编码.............................................................14

(-)H264压缩码率...................................................14

(二)GOP(GroupofPictures).....................................................................................14

(三)I/P/B帧............................................................15

(四)H264压缩技术(一系列压缩技术集合)..............................17

(五)宏块---最基础知识点...............................................17

四:I/P/B帧和音视频同步...................................................18

(―)I/P/B帧............................................................18

(二)PTS/DTS.....................................................................................................................18

(三)时间基............................................................19

(五)不同时间基的换算..................................................20

五:H264压缩技术.........................................................20

(一)帧内压缩......................................................20

(-)帧间压缩技术......................................................23

(三)无损压缩..........................................................25

(四)H264编解码流程...................................................25

视频基础

-:视频入门

(-)视频定义(什么是视频)

♦由一组图像组成

♦为了传辅/占用更小的空间而被压缩

♦最终在显示设备上展示(未被压缩)

(-)图像

♦像素

♦RGB

♦分辨率

1.像素:图像由像素组成(如下图图片中的一个个小格子)。

对于每个像素,还有位深的概念:用多少个位来表示位深。类似于音频中的采样大小

每个像素的㈱

♦RGB888(2<)

♦RGBA(32仪)

RGB888:对于R、G、B中每个元素占8位

RGBA:同上,多了一个A(透明度)

2.RGB:每个像素是由RGB三元素组成;如下图格子表示一个像素,内部由RGB(三个发光二

极管)组成。

通过RGB(三个发光二极管不同亮度组成)可以组合成多种色彩:

视频基础

七彩色

♦红十蓝=物色

♦绿+蓝=青色

♦红+绿=黄

♦红+缘+西=B

3.分辨率:用来表示图像在X、Y轴上各有多少个像素点。

(三)屏幕显示器

1.显示器和图像都具有像素!!!

对于屏幕而言,每一个像素如下所示:

根据图像的数据,来控制屏幕中每一个像素点的发光二极管的强度。从而实现不同颜色点,

拼接为最终图像!!

图像与屏幕的关系

♦图像是数据

♦屏幕是显示设备

♦图像数据经过驱动程序让屏幕显示图像

2.RGB的色彩问题(部分情况使用的BGR顺序,使得与显示器的驱动程序处理顺序不一致,

导致图像渲染出错)

♦RGB与BGR

♦BMP使用的是BGR格式,需要进行转换

3.屏幕指标

♦PPI(pixelsperinch)

♦DPI(Dotspeninch)

♦PPI>300就属于视网膜级别

PPI:每英寸下的像素数

DPI:每英寸下的点数

视频基础

二:YUV了解

各种格式解析:/rgb.php

(一)什么是YUV(有了RGB图像之后,为什么还需要YUV?)

由电视系统发展而来,逐步从黑白一。彩色;YUV可以兼容这两种模式。当获取丫信号之后

就可以正常的进行播放,此时颜色为黑白(黑白电视机可以播放)。UV用于描述影像的色彩

和饱和度(彩色电视机播放需要)。最标准YUV格式为YUV4:2:0。

YUV

♦YUV(也称YCbCr):Y表示明亮度,UV的作用是描述影像

色彩及饱^度。

♦主要的采样格式有YUV420、YUV4:2:2和YUV444

在DVD、摄像机、数字电视等消费类视频产品中,常用的色彩编码方案是YCbCr,其中

Y是指亮度分量,Cb指蓝色色度分量,而Cr指红色色度分量。

人的肉眼对视频的Y分量更敏感,因此在通过对色度分量进行子采样来减少色度分量后,

肉眼将察觉不到的图像质量的变化。

1.YUV图像各个分量

YUV原始图像:

YUV图像的丫分量(只有明亮度、没有色彩和饱和度):

YUV图像的U分量(只有Cb分量,图片蓝色分量)

YUV图像的V分量(只有Cr分量,图片红色分量)

视频基础

只有在电视中使用了YUV格式,在手机、屏幕、显示器中使用RGB格式,所以YUV显示在

屏幕需要进行转换!

2.RGB与YUV的关系

RGB与YUV的关系

♦RGB用于屏幕图像的展示

♦YUV用于采集与编码

RGB转YUV

Y=0.299*R+0.587*G'+0.114*B

U=-0.147*R-0.289*G+0.436*B=0.492*(B-Y)

V=0.615*R-0.515*G-0.100*8=0.877*(R-Y)

YUV转RGB

R=Y+1.140*V

G=Y-0394*U-0.581*V

B=Y+2.032*U

3.YUV常见格式

♦YUV4:4:4

♦YUV4:2:2

♦YUV4:2:0

YUV4:4:4一个Y元素对应一个U元素对应一个V元素,对于1280x720图像,数据量

为:1280x720x3-―其中3同RGB888一致,表示3个字节(24位)。

YUV4:2:2对于每一个横行,隔一列有一个UV,数据量为1280x720x1+2x1280x720/2

二1280x720x2---xl表示Y占1字节,/2是对于UV来说是每隔一列才有一个UV。

YUV4:2:0最标准,最a泛;隔行分U或者V分量,隔列分是否有UV分量;数据量为

1280x720x1+2x1280x720/4=1280x720x1.5

各个格式详细见下面图片!!

YUV4:2:0

YUV4:2:0

4:2:0并不意味着只有Y、Cb两个分量,而没有C吩量。它实际指得

是对每行扫描线来说,只有一种色度分量,它以2:1的抽样率存储。

相邻的扫描行存储不同的色度分量,也就是说,如果一行是4:2:0的

话,下一行就是4:0:2,再下一行是4:2:0…以此类推。

视频基础

YUV420

对于丫UV4:2:0而言满足下面的计算:

♦YUV=Y*1.5

♦YUV=RGB/2

YUV4:2:0优点:

LYUV兼容以前的图像

2.相比较RGB而言,数据量减少1半,存储更加具有优势」

补充:对齐知识!!!!

对于已经对齐的分辨率如:1280*720,640*480这样的分辨率它的YUV420P数据格式是完全

对齐Q6位对齐)

而像176*144这样的size它的YUV420P不是16位对齐,需要补空白位(0补齐),使得

176*144这样的size能16位对齐。

YUV4:2:2

YUV4:2:2

此格式的打包格式为,YUYVYUYVYUYV……(YUYV422格式):此格式的存储格式为:首先全是Y,然

后全是U,最后全是V。

YUV422P格式卯S3

视频基础

YUV4:4:4

YUV4:4:4

7^0■痴&嬴•.痴

•;•....[I.v&

更多格式见:/cgwang_1580/article/details/79595958

(二)YUV4:2:0存储格式

YUV数据是分层存储的,所以可以更加方便的与黑白电视机相兼容,只需要读取前面的丫数

据即可,后面的UV数据舍弃即可。对于彩色电视机,将后面的UV数据一块读取。

4:2:0,是指4个丫对应纵向1个U,1个V;如下图(色彩对应)

YUV4:2:0存储格式

Positioninbytestream:

PIEcapita^]BflEE理丽跟猫皿6前国圆圈砂xtrawjEmPMH购烟⑪购国

不同系统下,存储格式可能不同:比如I0S使用YV12,android使用NV21O

YUV存储格式

♦planar(平面)

1420:YYYYYYYYUUW=>YUV420P

YV12:YYYYYYYYWUU=>YUV420P

♦packed(打包)

NV12:YYYYYYYYUVUV=>YUV420SP

NV21:YYYYYYYYVUVU=>YUV420SP

视频基础

SingleFrameYUV420:NV12

Positioninbytestream:

tKJiuL-inunvi♦一—「量$/,「tTTifummQQQJ

YUV4:2:0码流计算:

未编码视频的YUV码流

♦RGB码流=分辩率(宽x高)x3x帧率

♦YUV码流=分辩率(竟x高)x1.5x帧率

(三)YUV命令行采集数据

原始mp4参数:

Stream»e:e(und):Video:h264(High)(avcl/0x31637661),yuv426p,864x486[SAR1:1DAR16:9],679kb/s,2Sfps,

25tbr,12866tbn,50tbc(default)

Metadata:

handler_nane:VtdeoHandler

vendor_td:[0][6][6][0]

1根据参数进行命令行采集YUV数据

ffmpeg-igfxm.mp4-an-c:vrawvideo-pixjmtyuv420pout.yuv

Output#0,rawvtdeo,to'out.yuv':

Metadata:

najor_brand:Ison

ntnor_version:512

conpattble_brands:tsontso2avclnp41

encoder:LavfS8.74.lee

StreamffO:e(und):Video:rawvtdeo(1420/0x30323449),yuv42ep(progresstve),864x486(SAR1:1DAR16:9],q=2-31,

125971kb/s,25fps,2Stbn(default)

Metadata:

handler_name:VtdeoHandler

vendor_td:[e][6][6][0]

encoder:Lavc58.132.180rawvtdeo

frane=3024fps=324q=-e.eLstze=I860。44kBttme=ee:62:60.96bttrate=125971.2kbtts/sspeed=13x

video:1860644kBaudto:OkBsubtttle:ekBotherstreams:6kBglobalheaders:6kBmuxtngoverhead:6.608600%

ffplay-pix_fmtyuv420p-s864*486out.yuv#-6是说明播放时的分辨率指定格

式如果两个参数不一致,会导致播放出现花屏等问题。

视频基础

播放YUV图像的丫分量i其他分量也可以播放):

ffplay-pix_fmtyuv420p-s864*486-vfextractplanes='y'out.yuv#-vf表示滤波器,vf属

于简单滤波

提取单独分量:

ffmpeg-igfxm.mp4-filter_complex'extractplanes=y+u+v[y][u][v]'-map'[y]'y.yuv-map'[□]'

u.yuv-map'[v]'v.yuv

#其中□表示别名,map可以引用别名

播放出现问题:

ffplay-s864*486y.yuv

Input#0,rawvtdeo.fron'y.yuv':

Duration:00:01:20.64,start:e.eeeooe,bttrate:125971kb/s

Strean«e:e:Video:rawvtdeo(142。/6x36323449),yuv420p.864x486.125971kb/s,25tbr,25tbn,25tbc

6.60M-V:-6.640fd,1OKBVQ*15377KBso:OBI

需要指定格式pix.fmt为单色,而不是按默认YUV去读取

ffplayy.yuv-pixjmtgray-s864*486

Input«e,rawvtdeo,fron'y.yuv':

Duratton:ee:02:ee.96,start:e.oeeoee,bitrate:83980kb/s

StreamVideo:rawvtdeo(Y8oe/6x36363859),gray,864x486,8398。kb/s,2Stbr,2Stbn,25tbc

2.87M-V:e.oeefd=6aq=6KBvq=16662KBsq=OBf=9/6

注意:对于U、V分量,由于是YUV4:2:0,其中U、V分量只占1/2(即X,丫轴分辨率各

自减少一半)

ffplayu.yuv-pixfmtgray-s432*243

视频基础

(四)FFmpeg编程采集

摘自:xllgrab见:https〃blogs.Tom/ssyfj/p/14m763S9.html

#include<stdio.h>

#include<libavutil/log.h>

#include<libavcodec/avcodec.h>

#include<libavdevice/avdevice.h>

^include<libavformat/avformat.h>

#include<libswresample/swresample.h>

voidrec_video(){

char*deviceneme="O.G"://:前面为空,表示录制本地;:后面,如果NumA为0,则表示连接到6000端口;使

用unixsocket方式连接时则表示连接的unixsocket的路径.如果为0,则表示连接到/tmp/.Xll-unix/XO.NumB则几乎总

是0.

charerrors[1024];

intret,count=0.len;

FILE*fp=NULL;

AVFormatContext*fmt_ctx=NULL;〃格式上下文获取....av_read_frame获取packet

AVDictionary*options=NULL;

AVInputFormat«iformat=NULL:

AVPacketpacket;〃包结构

〃获取输入(采集)格式

iformat=av_find_input_format("xllgrab");〃驱动.用来录制莫而

〃设置参数

av_dict_set(&options,"vid2O_size","1024»768",0);

av_dict_set(&options,"framerate","15",0);

〃打开输入设备

ret=avformat_open_input(&fmt_ctx,devicename.iformat,&options);〃--打开输入设备,初始化格式上下文和选项

if(ret<0){

av_strerror(ret,errors1024);

avlog(NULL.AVLOGERROR,"Failedtoopenvideodevice,p6d]Hs\n".ret.errors);

)

av_log(NULL.AV_LOG_INFO,"Successtoopenvideodevice\n");

〃打开文件

fp=fopen("./video.yuv",'\vb");

if(fp==NULLX

avlog(NULL,AV_LOGERROR,"Failedtoopenoutfile\n'j:

视频基础

gotofail;

)

〃开始从设备中读取数据

while((ret=av_readjrame(fmt_ctx,&packet))==0&&count++<500X

avlog(NULL.AVLOGINFO,"Packetsize:H>d(Mp).cout:?6d\n".packet,si2e.packet.data.count);

fwritefpacket.data,1.packet.size.fp);

fflush(fp);

〃释放空间

av_packpt_iJnrpf(Apackpr):

)

fail:

if(fp)

fcloseffp);

〃关闭设备、释放上下文空间

avformat_close_input(&fnt_ctx);

return;

)

intmain(intargc.char*argv)

(

av_register_all();

av_log_set_level(AV_LOG_DEBUG);

〃注册所有的设备,包括我们需要的音频设备

avdevice_register_all();

rec_video();

return0;

)

gcc-ogdOlGeiData.c-I/usr/local/ffmpeg/include/-L/usr/local/ffmpeg/lib/-lavutil-

lavformat-lavcodec-lavdevice-Iswresample

由于没有摄像头,所以使用了屏幕录制,所以采集的数据是BGR0类型

ffplayvideo.yuv-s1024*768-pix_fmtbgrO

Input#0,rawvideo,fromvideo.yuv':

Duration:00:00:20.00,start:0.000000,bitrate:629145kb/s

Stream#0:0:Video:rawvtdeo(BGR[0]/6x524742),bgr0,1024x768,629145kb/s,

25tbr,25tbn,25tbc

11.81M-V:0.085fd=8aq=OKBvq=0KBsq-0Bf=©/00

wWeayuv

-Coo^tChrome

0霸线“如•山上事

■FFmpegDevicesDocum

r:Apos♦皆£东大*-…Qmu呐幅DNS.

I<-->C■ffmpegocft^mpeg'd

|张A2♦甘濯东大―一…Sto

MFFmpeg

Ab0UGrab«lF

Oomrfoed

3.21.1

Documercanon

»acket5lze:314S728(0x7fdeS8c26O0t).cout:23S

kackttstze:3145728(Ox7fdeS8c266e»).cout:236C<MTwr»jn<yselect.

*ack«titZ«:314$72t(0x7fde$8c26d6t),COUt:2)7

Jacketsize:314S728(0x7fdeS8c26O0«)vCOUt:238KUAngUttS

视频基础

注意:在下面代码中直接写入packet.size大小,可能在处理摄像头YUV数据时出错

fwrite(packet.data,l,packet.size,fp);

写入时包大小:3145728

Packetsize:3145728(0x7fde58c26000),cout:494

读取时数据采用BGRO(最后0是指A透明度为不透明)大小4字节:

1024x768x4=3145728;

和前面的读取包大小packet.size一致,所以不会出错,如果两者不一致,那么需要修改

packet.size为我们想要的数据大小“

另外:主动选择像素格式

如果驱动允许我们自己设置pixeLformat,那么最好进行主动设置:

https:〃/ffmpeg-devices.html#avfourdation

补充:使用摄像头(借到了)

1.查看摄像头所支持的视频格式和分辨率

ffmpeg-hide_banner-fV4I2-listjormatsall-i/dev/videoO

Idjld-Lenovo-Product:*/FFRpeg/develop/charpter_0/vtdeo$ffnpeg-hidebanrer-fv4l2-listformatsall-t/dev/vtdeo6

(Vtdeo4ltnux2,v4l2电exlc26700]R)w:yuyv422:而YV4:2:2:640x480352x288320x240176x144166x120

发现只支持yuyv422格式…

2.测试摄像头

ffmpeg-fvideo4linux2-pixel_formatyuyv422-video_size320*240-framerate15-i

/dev/videoOout.yuv

ffplayout.yuv-s320*240-pixel_formatyuyv422

3.代码实现

//include<stdio.h>

#include<libavutil/log.h>

“include<libovcodcc/avcodcc.h>

^include<libavdevice/avdevice.h>

#include<libavformat/avformat.h>

#include<libswresample/swresample.h>

voidrec_video(){

char*devicename="/de^/videoO";〃设备文件描述符

charerrors[1024];

intret,count=0.len;

FILE*fp=NULL;

视频基础

AVFormatContext*fmt_cix=NULL;〃格式上下文获取----av.rejdjrame获取packet

AVDictionary*options=NULL;

AVInputFormat«iformat=NULL;

AVPacketpacket;〃包结构

〃获取输入(采集)格式

iformat=av_find_input_format("video4linux2");//驱动,用来录制视频

〃沿M参数ffmppo-fvicpo4linux?-pixeljormary”皿4,2-vidac_si?a640*480-framarata15-i/dftv/vidftnOoutyuv

av_dict_set(&options."vid2o_size"."640*480".0);

av_dict_set(&options,"framerate'',"30",0);

av_dict_set(&options."pixel_format"."yuyv422;0);

〃打开输入设备

ret=avformat_open_input(&fmt_ctx.devicename.iformat.&options);〃--打开输入设备,初始化格式上下文和选项

if(ret<0){

av_strerror(ret,errors1024);

av_log(NULL,AV_LOG_ERROR,"Failedtoopenvideodevice,[^]H3\n".ret.errors);

}

av_log(NULL.AV_LOGINFO,"Successtoopenvideodevice\n");

〃打开文件

fp=fopenC',/video.yuv",'\vb");

if(fp==NULLX

avJog(NULL.AV_LOG_ERROR,"Failedtoopenoutfile\n");

gotofail:

)

〃开始从设备中读取数据

while«ret=av_read_frame(fmt_ctx.&packet))==0&&count++<500X

av_log(NULL.AV_LOG_INFO,"Packetsize:H>d(Hp).cout:%d\n",packet.size.packet.data.count):

fwrite(packet.data,1,packet.size.fp);

fflush(fp);

〃释放空间

av_packet_unref(&packet):

)

fail:

if(fp)

fcloseffp);

〃关闭设备、释放上下文空间

avformat_close_input(&fnt_ctx);

return:

}

intmain(intargc.char*argv)

视频基础

av_register_all();

av_log_set_level(AV_LOG_DEBUG);

〃注册所有的设备,包括我们需要的音频设备

avdeviceregisterall();

rec_video();

return0;

三:H264编石马

(一)H264压缩码率

条件:1.YUV格式为YUV420

2.分辨率为640x480

3.帧率为15

YUV420下的码流大小为640x480x1.5(RBG为3字节,YUV420为1.5字节)、15=6912000

bytes=55.296mbps(换算为bits)

H264编码而言,建议的码流大小为500kbps,约为YUV420下的1/100!!!

参考码率:

https:〃docs.agora.io/cn/lnteractive%20Broadcast/API%20Reference/java/classiollagoral

lrtcllvideolLvideoencoderconfiguration.html#a4bo90cd0e9f6d98bcf89cbic4c2066e

8

5相率直艇率

(舱场景,Kbps)(直播场景,Kbps)

130

通信实时性要求高,所以码率相比较于直播会低很多,从而实现流畅度增加.

(二)GOP(GroupofPictures)

原始视频数据1s内,包含25帧,帧间隔时间为40ms:

当视频时间跨度为lOmin后,数据帧数变多

25x10x60=15000帧;不易压缩!!・・--引入分组(按照相关

性),如下图所有帧中只包含“玩电脑”、“望远镜”两个

动作,在此两个动作上进行微调;所以每一个组都是描述一个

图像目标的细微差别。所以,同一个组中的视频是强相关

的。而在不同组之间的相关性非常小。以此来进行分组,

视频基础

GOP由下图可以看出,GOP中帧与

帧之间差别很小。将无差别的背

景图用一张图表示,将中间人物

相同部分放置到一张图,将人物

中间望远镜位置等差值进行存

储。由此使得GOP这一组帧存

储空间被压缩得很小!!!

GOP中帧与帧之间的差别小

(三)I/P/B帧

编码帧的分类

♦I帧(intraframeframe),关键帧,采用帧内压缩技术。IDR帧

属于I帧

♦P帧(forwardPredictedframe),向前参考帧。压缩时,只参

考前面已经处理的帧,采用帧间压缩技术。它占I帧的一半大小

♦B帧(Bidirectionallypredictedframe),双向参考帧。压缩时,

既参考前面已经处理的帧,也参考后面的帧,帧间压缩技术。它

占I帧%大小

举例帧,是关键帧,如果缺失了该帧,则可能后面无法解析

对于前面所提到的GOP中,一组强相关帧中的第一帧,我们一般称为IDR帧(一种特殊的

I帧);

对于GOP中,如果包含过多的帧(超过一定范围),H254会强制加入一些I帧到GOP

中,用来防止一旦出现错误,导致错误串联的情况!!

对于I帧,不依赖其他任何帧,所以属于帧内压缩!!(编码、解码都只靠自己)

举例:P帧,参考前面的帧,前面解码,当前帧才可以解码;前面编码,当前帧才可以编

码。P帧只参考前面,不参考后面!!!属于帧间压缩技术,与前面的帧有关系.

举例:B帧,双向参考帧,压缩率最高,耗时严重,延迟大;所以对于实时性要求高的应用

中,基本使用I帧和P帧;对于音视频转码应用,为了节省空间,使用B帧多。

在GOP中,如果含有B帧数据,那么B帧一定是最后才进行解码的。但是播放的时候是

按照帧出现的顺序来播放的!!!

对于B帧来说,后面的P帧一定优于B帧先进行解码的???见下面补充:帧与分组的关

视频基础

系(默认H264下).

补充:IDR帧和I帧的区别和联系

IDR帧与I帧的区别与联系

♦IDR(InstantaneousDecoderRefresh)解码器立即刷新

♦每当遇到IDR帧时,解码器就会清空解码器参考buffer中的内容

♦每个GOP中的第一帧就是IDR帧

♦IDR帧是l种特殊的I帧

补充:帧与分组的关系(默认H264下)

帧与分组的关系

注意,如下图:对于在I帧和P帧之间的B帧,需要参考前面的I帧和后面的P帧。所以解

码顺序依次是I帧-->P帧中间3个B帧.

如下图,对于在两个P帧之间的B帧,参考前后的P帧即可

如下图,对于的B帧,参考前面GOP的P帧和后面GOP的I帧

注意:GOP中所有P帧率都是先于B帧的!!

补充:SPS与PPS

♦SPS(SequenceParameterSet)

序列参数集,作用于一串连续的初濒图像。如

seq_parameter_set_id,帧^^POC(pictureordercount)的

约会参考帧数目、解码图像尺寸和帧场编码模式选择标识等

♦PPS(PictureParameterSet)

图像参数集,作用于视频序列中的图像。如

pic_parameter_setjd,篇编码模式选择标识、片组数目,初始

量化参数和去方块谑波系数调降标识等

视频基础

(四)H264压缩技术(一系列压缩技术集合)

H264压缩技术

♦帧内压缩,解决的是空域数据冗余问题

♦帧间压缩,解决的是时域数据元徐问题

♦整数离散余弦变换(DCT),将空间上的相关性变为频域上无关

♦CABAC压缩

帧内压缩(有损压缩技术):解决空域数据冗余问题;——空域:一张图片是占用一定的

空间,帧内压缩技术,是用来解决图片内的数据压缩问题。(对于背景,主体等采用不同

方法压缩,使得总数据下降).

帧间压缩(有损压缩技术):解决时域数据冗余问题;——时域:帧与帧之间的数据之间

有参考,利用残差值------帧内压缩,是将不必要的数据去除,相比于亮度,色度要求更

低,所以压缩时可以除去部分色度数据,达到减少数据的要求!!------帧间压缩,由于依

赖前一帧的数据,而前一帧已经是有损的,所以参考前一帧的当前帧也是有损的!!

整数离散余弦变换(无损压缩技术)•——经过上面两种压缩后,数据已经很小了,但是

还可以通过DCT变换,将有用数据集中,其他位置为Q进行压缩。可以减少复杂度,利于

后面的无损压缩.

CABAC压缩(无损压缩技术):——根据上下文进行数据的压缩.

(五)宏块--最基础知识点

宏块

.宏块是视频压缩操作的基本单元

♦无论是帧内压缩还是帧间压缩,它们都以宏块为单位

原始图像:

H264宏块划分:如下图,按像素划分一个8x8像素的宏块,由于每个像素包含一个值,所

以可以看作右侧的3维图像!!!

宏块划分完成后:

对于每个宏块,我们还可以进一步划分为子块:如下图:宏块大小16x16,划分为4个8x8,

视频基础

进一步划分为4x4、4x8、8x4一系列子块(注意:子块也是宏块)

如果宏块特别大,则控制力弱,但是处理速度快;

对于细节多,纹理强的图,宏块需要划分较小,控制力更强,压缩比会更高。

可以对比下图右图,H264划分子块后的压缩比要高于MPEG2的压缩比。H264数据量小于

MPEGo

子块划分

宏块尺寸:(可以进一步划分,用来增强压缩率)

宏块的尺寸

U!:I/P/B帧和音视频同步

转载:https:〃rn.imooc.eom/mip/art:ide/91381

(―)I/P/B帧

对于I帧,B帧,P帧,前面三章已经进行了讲解。

•I帧是关键帧,它采用帧内压缩技术;

•B帧是前后参考帧,它属由帧间压缩技术。也就是说在压缩成B帧前,它会参考它

前面的非压缩视频帧,和后面的非压缩的视频帧,记录下前后两帧都不存放的"残

差值”,这样可以达到更好的压缩率;

•P帧是向前参考帧,也就是它参考的是前一个关键帧的数据。P帧也属于帧间压缩技

术,相对于B帧来说,P帧的压缩率要比B帧低。

但在实时互动直播系统中,很少使用B帧。主要的原因是压缩和解码B帧时,由于要双向参

考,所以它需要缓冲更多的数据,且使用的CPU也会更高。由于实时性的要求,所以一般

不使用它。不过对于播放器来说,遇到带有B帧的H264数据是常有的事儿。

(二)PTS/DTS

有了上面I/B/P帧的概念,我们再来理解PTS/DTS就非常容易了。

PTS(PresentationTimeStamp)是渲染用的时间戳,也就是说,我们的视频帧是按照PTS

的时间戳来展示的。

视频基础

DTS(DecodingTimeStamp)解码时间戳,是用于视频解码的。

那为什么有了PTS还要有DTS呢?这就与我们上面所讲的I/B/P帧有关了。

如果我们的视频中没有B帧,那显示的帧的顺序与存放的帧的顺序是一样的,此时PF与

DTS的值就是一样的,也就没有存在两个时间戳的必要了。

但有了B帧之后,就不是这个样子了。我们举个简单的例子:IBBP

实际应展示的顺序:IBBP

实际在解码的顺序:IPBB

按实际顺序号解码:1423

按实际顺序号展示:1234

对于上面这个例子我们作下说明:

1.我们实际应该展示的帧的顺序是I,B,B,P帧解码后的视频帧。

2.但实际上,这些帧到达之后,在缓冲区里就按照第二行的样子存放的。为什么会这

样呢?这是由于我上面所讲的,P帧参考的是I帧,B帧是双向参考帧。也就是说,

如果I帧和P帧没有解码的话,B帧是无法进行解码的。基于此,为了解决这个问

题就出现了PTS和DTS两个时间戳。

3.第三行是视频帧真正的解码顺序,先解I帧,然后是P帧,然后是第一个B帧,最

后是第二个B帧。

4.最终的展示顺序是I帧解码后的视频帧,第一个B帧解码后的视频帧,第二个B帧

解码后的视频帧,最后是P帧解码后的视频帖。

(三)时间基

有了时间戳之后,最终进行展示时还要需要将PTS时间戳转成以秒为单位的时间。那这里

需要向大家介绍一下ffmpeg的时间基。

我们在执行ffmpeg/ffplay命令时,可以通过控制台看到几个参数,分别是tbr,tbn,tbc,这

几个值是什么含义呢7其实就是不同的时间基.

tbr:是我们通常所说的帧率。timebaseofrate

tbn:视频流的时间基。timebaseofstream

tbc:视频解码的时间基。timebaseofcodec

在ffmpeg中,不同的时间戳对应不同的时间基。对于视频的渲染我们使用的是视频流的时

间基,也就是tbn0

那我们如何理解时间基呢?时间刻度(间隔)

其实非常简单,就是时间刻度。我们以帧率为例,如果每秒钟的帧率是25帧,那么它的时

间基(时间刻度)就是1/25o也就是说每隔1/25秒后,显示一帧。

所以如我们当前的时间是100,时间基是1/25,那么转成秒的时间是多少呢?

100*时音基(1/25),也就是100*1/25=4秒。

(四)ffmpeg内部时间基

除了我上面所讲的匚个时间基之外,ffmpeg内部遂有一个时间基。即我们通过所见到

的AV_TIME_BASEO它在ffmpeg内部定义如下:

#defineAV_TIME_B?.SE1000000

它还有一种分数所表式法:(这里就是时间间隔的数据存放结构,时间基由下面的函数av_q2d

获取)

#defineAV_TIME_BASE_Q(AVRational){l,AV_TIME_BASE)

视频基础

在ffmpeg中进行换算,将不同时间基的值转成按秒为单位的值计算如下:

timestamp(秒)=pts*av_q2d(time_base)#可以看出pts是以自己的时间基为间隔xpts

这里引入了av_q2d这个函数,它的定义非常简单:(获取时间基)

typedefstructAVRational{

intnum;//numerator

intden;//denominator

}AVRational;

staticinlinedoubleav_q2d(AVRationala){

*Convertrationaltodouble.

*@paramarationaltoconvel

**/

returna.num/(double)aden;

)

从这里我们可以看到.它与我上面所讲的公式是一样的。

(五)不同时间基的换算

在上面我向大家介绍了ffmpeg有好几种不同的时间基.有时候我们需要在不同的时间基之间做换算,ffmpeg为我们提供

了非常方便的函数。即

av,rescale_q()把时间歌从一个时基调整到另外一个时基时候用的函数,其中,a表式要换算的值;b表式原来的时间

基;c表式要转换的时间基。其计算公式为a*b/c

既然公式这么简单,我们自己写就0K了.为什么ffmpeg还要单独提供一个函数呢?其实这个看似简单的方法,还要考虑

数值溢出的问题。所以把这块的逻辑加上之后,就没我们看到的这么简单了。不过没关系.我们只要清楚av.rescale.q是做什

么的,怎么用就可以了。

下面我再给出两个算计公式:

•时间戳转秒

time_in_seconds=av_q2d(AV_TIME_BASE_Q)*timestamp#时间戳x时间基=口秒

•秒转时间戳

【imestamp=AV_TIME_BASE*time_in_seconds#秒/时间基=时间我

五:H264压缩技术

(一)帧内压缩

帧内压缩的理论

♦相临像索差别不大,所以可以进行宏块预测

.人们对亮度的数漉度超过色度

♦YUV很容易将亮度与色度分开

L相邻宏块之间的像素差别不大,可以进行预测。(以宏块为单位,而不是以像素为单位处

视频基础

理,后者效率太低;宏块最小为4x4小块)

2.黑白即可了解图片信息,色度为辅助(如黑白电视)。所以即便颜色有所偏差也无所谓。

3.YUV的优点就是直接获取丫亮度数据,UV数据进行单独处理。

通过预测的方法进行压缩:

当我们不知道下一个宏块列数据(如4x4像素大小),可以根据

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论