我是靠谱客的博主 多情云朵,最近开发中收集的这篇文章主要介绍C++-FFmpeg-(5)-2-h264-概念与名词:宏块-I-P-B帧;参数设置:ABR、CQP、CBR、CRF;码流:SPS-PPS,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部