概述
1.h264预测流程
1.1宏块的划分
1.2帧内预测-帧间预测
1.3DCT离散余弦变换
1.4量化
2.参数设置
2.1Ultrafast最快和zerolatency
2.2预设编码器
2.3ABR、CQP
2.4CBR恒定比特率_CRF恒定速率因子
3.码流
1.h264预测流程
1.1宏块划分:
跟卷积核的概念一样。
1.2帧内预测
独立解码,压缩率低
残差:
从散点图看,样本点散布在某一条直线的附近,而不是在一条直线上,所以不能用一次函数y=bx+a描述它们的关系。
误差和残差的区别
1、误差是测量测得的量值减去参考量值。测得的量值简称测得值,,代表测量结果的量值。所谓参考量值,一般由量的真值或约定量值来表示。 对于测量而言,人们往往把一个量在被观测时,其本身所具有的真实大小认为是被测量的真值。
2、残差在数理统计中是指实际观察值与估计值(拟合值)之间的差。"残差"蕴含了有关模型基本假设的重要信息。如果回归模型正确的话, 我们可以将残差看作误差的观测值。
1.3帧间预测
● I帧即Intra-coded picture(帧内编码图像帧),不参考其他图像帧,只利用本帧的信息进行编码。
● P帧即Predictive-coded Picture(预测编码图像帧),利用之前的I帧或P帧,采用运动预测的方式进行帧间预测编码。
● B帧即Bidirectionally predicted picture(双向预测编码图像帧),提供最高的压缩比,它既需要之前的图像帧(I帧或P帧),也需要后来的图像帧(P帧),采用运动预测的方式进行帧间双向预测编码。
在视频编码序列中,GOP即Group of picture(图像组),指两个I帧之间的距离,Reference(参考周期)指两个P帧之间的距离(如下图3.1)。一个I帧所占用的字节数大于一个P帧,一个P帧所占用的字节数大于一个B帧。
1.4DCT离散余弦变换+量化+熵编码
拿到了差值数据 模拟, 产生一组残值。
2.参数设置
2.1Ultrafast最快和zerolatency
//找到编码器
auto codec=avcodec_find_encoder(codec_id);
//上下文 分配空间+设定参数 宽、高、帧时间戳、格式、线程
auto c=avcodec_alloc_context3(codec);
c->width=400;
c->height=300;
c->time_base={1,25};
c->fmt=AV_PIX_FMT_YUV420P;
c->thread_count=16;
//设置编码器参数
c->max_b_frame=0; //b帧设为0,降低延时,增大空间
int opt_re=av_opt_set(c->priv_data,"preset","ultrafast",0);//最快速度
opt_re=av_opt_set(c->priv_data,"tune","zerolatency",0); //零延时
2.2预设编码器
2.3ABR、CQP
视频频码率: 一般指比特率,是表示单位时间内传送比特的数目。
1S视频数据是多少字节,8比特1字节,比特率就字节数*8。
CQP(Constant QP):恒定QP(Quantization Parameter)。
CRF(Constant Rate Factor)/CQF(Constant Quality Factor):恒定质量因子。
ABR(Average Bitrate):指定平均码率。
CBR(Constant Bitrate):恒定码率,相对的是可变码率(VBR, Variable Bitrate)。
VBV(Video Buffering Verifier):视频缓冲校验。
CBR(固定比特率)
Constant BitRate的缩写,意思是恒定(固定)比特率,指文件每秒钟的码率是固定不变的。CBR的特点是码率平稳,固定码流控制可以减少网络抖动的影响,不大起大落,适合网络直播。
VBR(动态比特率)
Variable BitRate的缩写,意思是可变比特率,指文件每秒钟的码率是可以变化的。VBR的特点是码率波动起伏较大,但总体省空间,主要用来存储。网络条件非常好的情况下也是可以用的。
ABR(平均比特率,CBR和VBR的折衷)
average bitrate的缩写,ABR编码平均比特率,是VBR的一种插值参数。Lame针对CBR不佳的文件体积比和VBR生成文件大小不定的特点独创了这种编码模式。ABR也 被称为“Safe VBR”,它是在指定的平均Bitrate内,以每50帧(30帧约1秒)为一段,低频和不敏感频率使用相对低的流量,高频和大动态表现时使用高流量。
H264 0-51 0,不算,无损压缩 越大效果越差。数字越大,压缩率越高。
//1. ABR 平均比特率
int br = 400000; //400kb
c->bit_rate=br;
//2.CQP 恒定质量 H.264中的QP范围从0到51
// x264默认 23 效果较好18
// x265默认28 效果较好25
av_opt_set_int(c->priv_data,"qp",51,0);
2.4CBR恒定比特率_CRF恒定速率因子
可用于直播和点播流的最常见编码参数之一是比特率控制,它决定了编码器如何分配文件中的编码音频和视频数据。常见的方法有三种:恒定比特率编码(CBR)、可变比特率编码(VBR)和约束可变比特率编码(CVBR)。
CBR:编码器在文件的持续时间内保持恒定的比特率,不会因视频的复杂性或运动而变化。
VBR:
CVBR:本质上,您是在告诉编码器在视频文件的持续时间内平均为 2 Mbps,但在任何情况下都不能让视频比特率超过 4 Mbps。
恒定速率因子(CRF,Constant Rate Factor)是一种编码模式,可以向上或向下调整文件数据速率以达到选定的质量级别,而不是特定的数据速率。CRF可以用于保持整个视频流质量恒定。
///1. 恒定速率因子(CRF)
av_opt_set_int(c->priv_data, "crf", 23, 0);
///2. 约束编码(VBV) Constrained Encoding (VBV)
av_opt_set_int(c->priv_data, "crf", 23, 0);
c->rc_max_rate = br;
c->rc_buffer_size = br * 2;
3.码流NALU SPS PPS IDR帧
sps:7,作用
pps:8,
CAVLC: 变长编码方式 熵编码-无损压缩
CABAC:算术编码方式
//1.AVFrame 分配空间+参数设置+数据区赋值YUV402P 250帧 10s的视频
auto frame=av_frame_alloc();
frame->width=c->width;
frame->height=c->height;
frame->format=c->pix_fmt;
re=av_frame_get_buffer(frame,0);
for(int i=0;i<250;i++)
{
for(int x=0;x<frame->height;x++)//y
{
for(int y=0;y<frame->width;y++)
{
frame->data[0][y*frame->linesize[0]+x]=x+y+i*3;
}
}
for(int x=0;x<frame->height/2;x++)//u v
{
for(int y=0;y<frame->width/2;y++)
{
frame->data[1][y*frame->linesize[1]+x]=128+x+y+i*3;
frame->data[2][y*frame->linesize[2]+x]=64+x+y+i*3;
}
}
}
//2.AVFrame ->AVPackage 发送压缩
auto pkt = av_packet_alloc();
re= avcodec_send_frame(c,frame);
while(re>=0)
{
re=avcodec_receive_packet(c,pkt); //成对出现发送压缩
av_packet_unref(pkt); // 接收释放
/// 分析NALU
/// 一个AVPacket中包含多个NALU 以0001间隔,多个是以001间隔
/ 0001[NAL_HEAD]
[NAL_HEAD]
//1个字节 orbidden_bit(1bit),nal_reference_bit(2bits)(优先级),
/// nal_unit_type(5bits)
/// 1:非IDR图像中不采用数据划分的片段
/// 5:IDR图像的片段
/// 6:补充增强信息(SEI)
/// 7:序列参数集 / SPS
/// 8:图像参数集 / PPS
int nal_unit_type = 0;
unsigned char nal_head = *(pkt->data + 4); //+4 去掉开头的0001
nal_unit_type = nal_head & 0x1f;//取后五位 0001 1111
cout << nal_unit_type << " " << flush;
for (int i = 4; i < pkt->size - 4; i++) //一个data中由多条nalu
{
if (pkt->data[i] == 0 &&
pkt->data[i + 1] == 0 &&
pkt->data[i + 2] == 1) { ///001
nal_unit_type = pkt->data[i + 3] & 0x1f;
cout << "(" << nal_unit_type << ")" << flush;
}
}
}
av_packet_free(&pkt);
最后
以上就是多情云朵为你收集整理的C++-FFmpeg-(5)-2-h264-概念与名词:宏块-I-P-B帧;参数设置:ABR、CQP、CBR、CRF;码流:SPS-PPS的全部内容,希望文章能够帮你解决C++-FFmpeg-(5)-2-h264-概念与名词:宏块-I-P-B帧;参数设置:ABR、CQP、CBR、CRF;码流:SPS-PPS所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复