X264编码流程

X264编码流程详解 对H.264编码标准一直停留在理解原理的基础上,对于一个实际投入使用的编码器是如何构建起来一直感觉很神秘,于是决定在理解理论的基础上潜心于编码器实现框架。关于开源的H264编码器有很多,JMVC,T264、X264,这里选择X264,因为网上关于X264源码分析资源很多。X264编码器是一个开源的经过优化的高性能H.264编码器,目前最新的源码在本人的I5处理器的PC机上,编码1920x1080分 阅读详情
对H.264编码标准一直停留在理解原理的基础上,对于一个实际投入使用的编码器是如何构建起来一直感觉很神秘,于是决定在理解理论的基础上潜心于编码器实现框架。关于开源的H264编码器有很多,JMVC,T264、X264,这里选择X264,因为网上关于X264源码分析资源很多。X264编码器是一个开源的经过优化的高性能H.264编码器,目前最新的源码在本人的I5处理器的PC机上,编码1920x1080分辨率的视频序列在使用ultrafast配置的情况下,可以实现160fps左右的编码速度。 这里对源码分析并没有选择最新的源码,而是选用2009年2月份的版本,原因有二:一是这个版本是从网上下载下来的,已经是一个建立好的VS2008工程,对于像我这种用惯IDE调试的程序员来说,这可以大大提高源码阅读速度;二是虽然X264源码虽然几乎每天都有更新,但是从这个版本以后,最大的改动基本是针对多Slice编码的支持,其他都是在输入输出方面的一些改动,从这个版本学习可以较快进入编码部分的学习;三是这个版本当中已经有别人的很多的注释,便于自己理解; 一般将编码分为帧级、片级、宏块级编码,依次从上到下。下面就从这三个级分析X264编码流程: 一、帧级编码分析 定位到x264_encoder_encode这个函数,这个函数应该是H264编码最上层的函数,实现编码一帧视频。在进行下一步分析之前有必要了解,控制X264编码的全局性结构体x264_t,这个结构体控制着视频一帧一帧的编码,包括中间参考帧管理、码率控制、全局参数等一些重要参数和结构体。 下面是x264_t这个结构体的定义(这里仅对几个关键的结构和变量进行分析):
struct x264_t  
{  
    x264_param_t    param;//编码器编码参数,包括量化步长、编码级别等等一些参数  
  
...........  
    int             i_frame;//编码帧号,用于计算POC(picture of count 标识视频帧的解码顺序)  
...........  
    int             i_nal_type;     /* Nal 单元的类型,可以查看编码标准,有哪几种类型,需要理解的类型有:不分区(一帧作为一个片)非IDR图像的片;片分区A、片分区B、片分区C、IDR图像中的片、序列参数集、图像参数集 */  
  
    int             i_nal_ref_idc;  /* Nal 单元的优先级别<span style="background-color: rgb(255, 255, 255); ">取值范围[0,1,2,3],值越大表示优先级越高,此Nal单元就越重要</span>*/  
  
    /* We use only one SPS(序列参数集) and one PPS(图像参数集) */  
    x264_sps_t      sps_array[1];//结构体的数组  
    x264_sps_t      *sps;  
    x264_pps_t      pps_array[1];  
    x264_pps_t      *pps;  
    int             i_idr_pic_id;  
  
......  
  
    struct  
    {  
//这个结构体涉及到X264编码过程中的帧管理,理解这个结构体中的变量在编码标准的理论意义是非常重要的  
        x264_frame_t *current[X264_BFRAME_MAX*4+3];/*已确定帧类型,待编码帧,每一个GOP在编码前,每一帧的类型在编码前已经确定。当进行编码时,从这里取出一帧数据。*/  
        x264_frame_t *next[X264_BFRAME_MAX*4+3];//尚未确定帧类型的待编码帧,当确定后,会将此数组中的帧转移到current数组中去。  
        x264_frame_t *unused[X264_BFRAME_MAX*4 + X264_THREAD_MAX*2 + 16+4];/*这个数组用于回收那些在编码中分配的frame空间,当有新的需要时,直接拿过来用,不用重新分配新的空间,提高效率*/  
        /* For adaptive B decision */  
        x264_frame_t *last_nonb;  
  
        /* frames used for reference + sentinels */  
        x264_frame_t *reference[16+2];//参考帧队列,注意参考帧都是重建帧  
  
        int i_last_idr; /* 上一次刷新关键帧的帧号,配合前面的i_frame,可以用来计算POC */  
  
        int i_input;    /* Number of input frames already accepted *///frames结构体中i_input指示当前输入的帧的(播放顺序)序号。  
  
        int i_max_dpb;  /* 分配解码图像缓冲的最大数量(DPB) */  
        int i_max_ref0;//最大前向参考帧数量  
        int i_max_ref1;//最大后向参考帧数量  
        int i_delay;    /* Number of frames buffered for B reordering */  
        //i_delay设置为由B帧个数(线程个数)确定的帧缓冲延迟,在多线程情况下为i_delay = i_bframe + i_threads - 1。  
        //而判断B帧缓冲填充是否足够则通过条件判断:h->frames.i_input <= h->frames.i_delay + 1 - h->param.i_threads。  
        int b_have_lowres;  /* Whether 1/2 resolution luma planes are being used */  
        int b_have_sub8x8_esa;  
    } frames;//指示和控制帧编码过程的结构  
  
    /* current frame being encoded */  
    x264_frame_t    *fenc;//指向当前编码帧  
  
    /* frame being reconstructed */  
    x264_frame_t    *fdec;//指向当前重建帧,重建帧的帧号要比当前编码帧的帧号小1  
  
    /* references lists */  
    int             i_ref0;//前向参考帧的数量  
    x264_frame_t    *fref0[16+3];     /* 存放前向参考帧的数组(注意参考帧均是重建帧) */  
    int             i_ref1;//后向参考帧的数量  
    x264_frame_t    *fref1[16+3];     /* 存放后向参考帧的数组*/  
    int             b_ref_reorder[2];  
........  
};  

定位到x264_encoder_encode这个函数,这个函数应该是H264编码最上层的函数,实现编码的帧级处理(如何进行参考帧管理、帧类型确定等等)。
 下面对x264_encoder_encode中几个关键函数以及关键部分进行分析:

1、x264_reference_update这个函数主要完成参考帧的更新,H.264的帧间预测需要使用参考帧,参考帧使用的都是已编码后的重建帧,每编码一帧的同时会重建此帧作为参考帧,在编码下一帧时,将此重建帧加入到参考帧队列中。函数实现如下:

static inline void x264_reference_update( x264_t *h )  
{  
    int i;  
  
    if( h->fdec->i_frame >= 0 )//重建帧帧数大于等于零时  
        h->i_frame++;//当前编码帧的帧号要比重建帧的帧号大1  
  
    if( !h->fdec->b_kept_as_ref )/*如果重建帧不作为参考帧(不作为参考帧,当然不用加入参考帧队列了)*/  
    {//when b frame is not used as reference frame  
        if( h->param.i_threads > 1 )  
        {  
            x264_frame_push_unused( h, h->fdec );  
            h->fdec = x264_frame_pop_unused( h );  
        }  
        return;//if b-frame is not used as reference, return   
    }  
  
    /* move lowres(低分辨率) copy of the image to the ref frame */  
    for( i = 0; i < 4; i++)  
    {/*暂时还不知道干嘛的*/  
        XCHG( uint8_t*, h->fdec->lowres[i], h->fenc->lowres[i] );  
        XCHG( uint8_t*, h->fdec->buffer_lowres[i], h->fenc->buffer_lowres[i] );  
    }  
  
    /* adaptive B decision needs a pointer, since it can't use the ref lists */  
    if( h->sh.i_type != SLICE_TYPE_B )  
        h->frames.last_nonb = h->fdec;  
  
    /* move frame in the buffer */  
    x264_frame_push( h->frames.reference, h->fdec );/*把重建帧放入参考队列中*/  
    if( h->frames.reference[h->frames.i_max_dpb] )/*如果参考帧的个数大于解码图像缓存的最大数(decoded picture buffer(DPB))*/  
        x264_frame_push_unused( h, x264_frame_shift( h->frames.reference ) );/*取出参考队列中第一个参考重建帧,并放入暂时不用帧队列中*/  
    h->fdec = x264_frame_pop_unused( h );/*从暂时不用帧队列中,取出一帧作为新的重建帧buf*/  
}  

2、帧排序部分,在H.264标准中采用编码顺序与显示顺序不同的编码方式,对于一个已经确定帧类型的待编码序列:IBBPBBP在编码时需要先排序为IPBBPBB,然后进行编码。在X264代码中,实现在如下部分:
//确定帧的类型  
      x264_stack_align( x264_slicetype_decide, h );/*通过x264_slicetype_decide函数来确定决定h-frames.next[]中每一帧的类型*/  
  
      /* 3: move some B-frames and 1 non-B to encode queue 这里来完成帧排序,还是有点巧妙的*/  
      while( IS_X264_TYPE_B( h->frames.next[bframes]->i_type ) )  
          bframes++;/*注意这个循环查找的作用,一方面可以确定第一个非B帧之前B帧的数量,也可以定位出第一个非B帧的位置*/  
      x264_frame_push( h->frames.current, x264_frame_shift( &h->frames.next[bframes] ) );/*取出第一个非B帧,并放到current指针第一个位置:通过这两步完成帧排序的(例如BBP->PBB)*/  
      /* FIXME: when max B-frames > 3, BREF may no longer be centered after GOP closing */  
      if( h->param.b_bframe_pyramid && bframes > 1 )  
      {  
          x264_frame_t *mid = x264_frame_shift( &h->frames.next[bframes/2] );  
          mid->i_type = X264_TYPE_BREF;  
          x264_frame_push( h->frames.current, mid );  
          bframes--;  
      }  
      while( bframes-- )  
          x264_frame_push( h->frames.current, x264_frame_shift( h->frames.next ) ); /*然后依次取出B帧,并放到current队列中*/  
下面就可以从h->frames.current队列中取出第一帧放入h->fenc中
h->fenc = x264_frame_shift( h->frames.current );//从当前编码帧中取出第一帧,作为当前编码帧  
然后就开始编码,首先当前编码帧(h->fenc)的类型,设定slice类型,这里就不解释了,关于IDR帧,执行了x264_reference_reset这个函数将参考帧队列清空。
接着进行相关参数的赋值,这里主要对POC的计算强调一下:
h->fenc->i_poc = 2 * (h->fenc->i_frame - h->frames.i_last_idr);//考虑到场编码,POC每帧增长为2,如果是场编码POC增长为1  
3、重建参考帧列表(x264_reference_build_list),即将参考帧列表中的参考帧分为前向参考帧和后向参考帧,并根据POC进行参考帧排序。函数具体实现如下:
static inline void x264_reference_build_list( x264_t *h, int i_poc )  
{  
    int i;  
    int b_ok;  
  
    /* build ref list 0/1 */  
    h->i_ref0 = 0;//前向参考帧索引  
    h->i_ref1 = 0;//后向参考帧索引  
    for( i = 0; h->frames.reference[i]; i++ )  
    {//注意这里都是指针操作  
        if( h->frames.reference[i]->i_poc < i_poc )  
        {//小于当前帧POC的,放到前向参考帧列表中  
            h->fref0[h->i_ref0++] = h->frames.reference[i];  
        }  
        else if( h->frames.reference[i]->i_poc > i_poc )  
        {//大于当前帧POC的,放到后向参考帧列表中  
            h->fref1[h->i_ref1++] = h->frames.reference[i];  
        }  
    }  
  
    /* Order ref0 from higher to lower poc */  
    do  
    {/*采用冒泡排序(不知道使用dowhile+for循环与双重for循环有什么优势),对参考帧按照POC从高到低进行排序*/  
        b_ok = 1;  
        for( i = 0; i < h->i_ref0 - 1; i++ )  
        {  
            if( h->fref0[i]->i_poc < h->fref0[i+1]->i_poc )  
            {  
                XCHG( x264_frame_t*, h->fref0[i], h->fref0[i+1] );  
                b_ok = 0;  
                break;  
            }  
        }  
    } while( !b_ok );  
    /* Order ref1 from lower to higher poc (bubble sort) for B-frame */  
    do  
    {  
        b_ok = 1;  
        for( i = 0; i < h->i_ref1 - 1; i++ )  
        {  
            if( h->fref1[i]->i_poc > h->fref1[i+1]->i_poc )  
            {  
                XCHG( x264_frame_t*, h->fref1[i], h->fref1[i+1] );  
                b_ok = 0;  
                break;  
            }  
        }  
    } while( !b_ok );  
  
    /* In the standard, a P-frame's ref list is sorted by frame_num. 
     * We use POC, but check whether explicit reordering is needed */  
    h->b_ref_reorder[0] =  
    h->b_ref_reorder[1] = 0;  
    if( h->sh.i_type == SLICE_TYPE_P )  
    {  
        for( i = 0; i < h->i_ref0 - 1; i++ )  
            if( h->fref0[i]->i_frame_num < h->fref0[i+1]->i_frame_num )  
            {  
                h->b_ref_reorder[0] = 1;  
                break;  
            }  
    }  
  
    h->i_ref1 = X264_MIN( h->i_ref1, h->frames.i_max_ref1 );  
    h->i_ref0 = X264_MIN( h->i_ref0, h->frames.i_max_ref0 );  
    h->i_ref0 = X264_MIN( h->i_ref0, h->param.i_frame_reference ); // if reconfig() has lowered the limit  
    assert( h->i_ref0 + h->i_ref1 <= 16 );  
    h->mb.pic.i_fref[0] = h->i_ref0;//为什么参考帧选择这两个,还没有搞懂  
    h->mb.pic.i_fref[1] = h->i_ref1;  
}  

4、初始化比特流,写入SPS以及PPS信息后就开始进行片级编码。
if( i_nal_type == NAL_SLICE_IDR && h->param.b_repeat_headers )  
    {/*SPS和PPS是解码需要用到的信息,因此只有解码器解析了SPS和PPS信息 
     才能进行解码,这就是为什么在每个IDR帧前写入这些信息*/  
        if( h->fenc->i_frame == 0 )  
        {//仅仅在第一针写入sei信息  
            /* identify ourself */  
    <span style="white-space:pre">  </span>x264_nal_start( h, NAL_SEI, NAL_PRIORITY_DISPOSABLE );/*开始整理nal。*/  
            x264_sei_version_write( h, &h->out.bs );//写sei信息  
            x264_nal_end( h );  
        }  
  
        /* generate sequence parameters */  
        x264_nal_start( h, NAL_SPS, NAL_PRIORITY_HIGHEST );/*开始整理nal。一个nal单元的首地址被赋值, 
<span style="white-space:pre">          </span>将要处理此新的nal单元;设置nal的优先权和类型。*/  
        x264_sps_write( &h->out.bs, h->sps );/*写SPS信息。 
            将序列参数集sps写进位流结构中h->out.bs 
            不是每次都要写SPS and PPS,只有碰见立即刷新片(NAL_SLICE_IDR)时才写*/  
        x264_nal_end( h );/*结束nal,整理nal 
            (1)输出新nal单元的地址 
            (2)自增表示下一个新nal单元的序号*/  
  
        /* generate picture parameters */  
        x264_nal_start( h, NAL_PPS, NAL_PRIORITY_HIGHEST );/*开始整理nal。 
                一个nal单元的首地址被赋值,将要处理此新的nal单元;设置nal的优先权和类型。*/  
        x264_pps_write( &h->out.bs, h->pps );/*写PPS信息。 
            将序列参数集sps写进位流结构中h->out.bs 
            不是每次都要写SPS and PPS,只有碰见立即刷新片(NAL_SLICE_IDR)时才写*/  
        x264_nal_end( h );/*结束nal,整理nal 
            (1)输出新nal单元的地址 
            (2)自增表示下一个新nal单元的序号*/  
    }  
接着就开始片级编码x264_slices_write( h );
二、片级编码分析

转载文章链接 转载文章链接







【x264】x264编码器参数配置 文章汇总了x264编码器参数配置,包括默认配置、不同档位配置以及优化策略配置 阅读详情

相关推荐

【x264编码器】章节1——x264编码流程及基于x264的编码器demo

提供了一种方便的方式来根据指定的配置profile应用相应的设置到 x264 参数结构体上。不同的配置文件类型会对参数结构体进行不同的修改,以满足特定的编码需求。然后是编码器参数,包括帧参考数、最大关键帧间隔、最小关键帧间隔、B 帧数、场景切换阈值等。结构体的成员进行赋值,将其初始化为默认值。之后是一些编码器设置,如去块滤波、CABAC 编码、码率控制方法、参考帧压缩系数等。接下来是一系列与视频属性相关的参数,如色度格式、宽度、高度、宽高比等。然后是一些与日志输出、分析类型、量化矩阵等相关的参数。

vcvdv123的博客 5746

【x264】x264编码库的安装与使用

X264是一个开源的H.264/MPEG-4 AVC视频编码器库。它是一个纯软件的H.264视频编码器,完全基于CPU进行运算,不依赖硬件编码器驱动。

qq_38089448的博客 1412

【x264编码器】章节2——x264的lookahead流程分析

X264_B_ADAPT_TRELLIS方案:会保留前面每次计算得到的最优帧结构方案,从而插入0到bframes逐次的B帧,求得当前长度最优方案,之后再这个基础上,计算长度+1的最优方案,不断迭代,直到处理完整个GOP,对应代码见slicetype_path_cost;宏块树比较简单的解释作用就是:帧与帧之间存在参考的关系,如果被参考的帧拥有更高的质量,那么通过调整一个帧,就可以改善一批帧质量,因此MB tree是根据帧被引用得程度,也可以认为是遗传给了其他帧多少信息,作为衡量该帧的重要性;

vcvdv123的博客 6375

【x264】x264编码主流程简单分析

x264编码主流程当中,主要涉及的内容包括多线程处理,读取配置文件,处理帧的头部信息,处理帧级别的配置信息,进行帧编码之后,释放掉配置文件。应当思考的内容包括: 1. 多线程在工程之上应用很多,尤其是多流的发送和接收,与网络TCP协议结合起来,此外还需要熟悉socket的使用和运用方式 2. 读取配置文件是与外部的接口,里面的配置项,具体涉及到编码器当中的哪个模块,是在哪些地方有影响,影响不同的工具之后,编码的性能有多大的差异,在何种情况下使用何种配置项...

weixin_42877471的博客 1464

【x264编码器】章节4——x264的帧内预测流程

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考。

vcvdv123的博客 4381

【x264编码器】章节5——x264的帧间预测流程

其中运动估计算法有钻石搜索算法X264_ME_DIA、六边形搜索算法X264_ME_HEX、X264_ME_UMH和X264_ME_TESA算法,其中钻石搜索算法和六边形搜索算法可以参考。函数用于预测16x16宏块的运动矢量,主要从参考块中获取,并存储在。

vcvdv123的博客 4296

x264大致编码流程

只写了主要函数的功能大概是什么,详细代码还需要自己细看研究。 x264中主要的函数调用关系如下: main()—>main_internal() main_internal()调用parse()函数解析输入的参数,调用encode()函数编码 parse()函数调用以下函数: x264_param_default():给保存参数的结构体x264_param_t中的变量赋默认值 getopt...

weixin_42147726的博客 819

在MCUXpresso上通过J-link烧写KW45

背景: KW45B是nxp 的ble npi产品,其使用的IDE为MCUXpressso或者IAR,MCUXpressso有一些bug,但是由于MCUXpressso阅读查找代码相对IAR容易,所以我经常使用的MCUXpressso进行开发。当然IAR也有其优势,比如编译、烧写速度相对MCUXpressso更快,是比较通用的一个平台,而MCUXpressso是NXP独有的。 Kw45有两种烧写方式,一是使用MCUlink,二是使用Jlink。NXP ble 产品线提供的IDE资料里有最新的15.0版本的

weixin_41889258的博客 2859

x264 macroblock_encode宏块编码流程

本文描述x264中对宏块是如何进行编码的,前面文章已经描述了一个I slice是如何进行缓存信息加载,如何通过x264_macroblock_analyse进行宏块分析选择合适的预测模式,完成上述步骤后,x264通过x264_macroblock_encode对宏块进行编码。

qq_41678939的博客 1734

Ubuntu声卡检测与故障排查:从基础命令到驱动修复

本文详细介绍了在Ubuntu系统中进行声卡检测与故障排查的完整流程。从使用lspci、aplay等基础命令识别硬件,到排查驱动冲突、修复权限问题,再到调整PulseAudio高级配置,提供了一套系统性的解决方案。文章结合实战案例,帮助用户快速诊断并解决Ubuntu系统常见的“无声”问题,恢复音频功能。

g2h3i4j5的博客 229

计算机视觉(相机标定;内参;外参;畸变系数)

目录 一、预备知识 1、坐标系变换过程(相机成像过程) (1)相机坐标系转换为图像坐标系(透视投影变换遵循的是针孔成像原理) (2)齐次坐标的引入原因:(为什么引入齐次坐标???) 2、内参与外参矩阵的构成 3、畸变参数 二、相机标定 1、张正友标定法(光学标定)及其求解思路 2、求解内参矩阵与外参矩阵的思路: (1)计算内参与外参矩阵的乘积M (2)求解内参矩阵A (3)求解外参矩阵(R1 R2 T) 三、参数优化 1、L-M算法 2、相机标定步骤 四、相关代码及其实验结.

QYJ_WORKHARDING的博客 6万+

X264编码流程详解(转)

http://blog.youkuaiyun.com/xingyu19871124/article/details/7671634 对H.264编码标准一直停留在理解原理的基础上,对于一个实际投入使用的编码器是如何构建起来一直感觉很神秘,于是决定在理解理论的基础上潜心于编码器实现框架。关于开源的H264编码器有很多,JMVC,T264、X264,这里选择X264,因为网上关于X264源码分析资源很多。X26

wainiwann的专栏 481

window下安装并使用nvm(含卸载node、卸载nvm、全局安装npm)

文章目录一、卸载node二、安装nvm三、配置路径和下载源四、使用nvm安装node五、nvm常用命令六、卸载nvm七、遇到的问题 nvm 全名 node.js version management,顾名思义是一个nodejs的版本管理工具。通过它可以安装和切换不同版本的nodejs。 一、卸载node 如果你已经安装了node,那么你需要先卸载node,如果你没有安装那直接跳过这一步到下一步。 打开控制面板 -> 打开程序和功能 -> 右上角搜索输入node -> 右键卸载 为了确保彻底

HuangsTing的博客 41万+

x264编码流程

对H.264编码标准一直停留在理解原理的基础上,对于一个实际投入使用的编码器是如何构建起来一直感觉很神秘,于是决定在理解理论的基础上潜心于编码器实现框架。关于开源的H264编码器有很多,JMVC,T264、X264,这里选择X264,因为网上关于X264源码分析资源很多。X264编码器是一个开源的经过优化的高性能H.264编码...

Moomin的博客 1463

文档多模态识别工具对比:MinerU、PaddleOCR、Marker

本文对比了三款文档多模态识别工具:MinerU、PaddleOCR和Marker。MinerU专注于中文文档的端到端解析,支持复杂元素提取和结构化输出,适合中文论文和教材解析。PaddleOCR是通用OCR工具包,支持多语言和全流程任务,适用于发票、车牌等图像OCR。Marker则注重多语言支持和轻量化部署,适合英文论文和技术文档的快速转换。三者在核心技术、中文优化、表格处理、输出格式、部署复杂度和适用语言等方面各有优劣。选型建议根据具体需求:MinerU适合高精度中文解析,PaddleOCR适合定制化OC

朴拙科技的博客 4746

从零开始:QNX SDP 8.0开发环境搭建与实战入门

本文详细介绍了如何从零开始搭建QNX SDP 8.0开发环境并进行实战入门。内容涵盖许可证获取、环境安装、命令行与IDE工具使用、BSP构建、系统镜像生成,以及编写、编译和运行第一个QNX程序的全过程。旨在帮助嵌入式开发者,特别是汽车电子和工业控制领域的工程师,快速掌握这一实时操作系统(RTOS)的开发基础。

weixin_29163857的博客 642

X264的编码基本流程

2. X264的编码基本流程 (1)接口变更  以前曾经写过文章介绍X264的编程架构并且分析了它的接口,现在进一步看看x264是怎么把YUV图像编程H.264编码的。在代码分析中,最容易让人头疼的是X264代码随处充斥着的多线程处理和码率控制两方面的代码,所以,这里将先简化过程,忽略掉这些非主体代码。需要说明的是,本文分析的是版本77,2009年10月的版本。   这里的API比版本66

fangbaolei2088的专栏 1068

AE 与 ISP 参数联动机制解析:自动曝光系统与图像信号处理模块协同设计实践

AE(自动曝光)并不是一个独立的图像控制模块,而是与 ISP(Image Signal Processor)深度耦合运作的系统协同体。其输出的曝光参数直接决定了图像处理链路中 Gamma 曲线选择、黑电平补偿、去噪级别、边缘增强等一系列关键参数的取值。本文基于主流平台(如高通、MTK、海思)的工程实战经验,详细剖析 AE 与 ISP 在曝光驱动、调节优先级、图像还原逻辑等环节的联动机制,并结合拍照与视频等不同场景,给出可落地的联调方法。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 1528

学习笔记(一)(x264编码流程)

学习笔记(一)(x264编码流程)作者 张士辉 11月 2, 2007 <!--google_ad_client = "pub-0719655617964414";google_ad_width = 200;google_ad_height = 200;google_ad_format = "200x200_as";google_ad_type

andoyu的专栏 2839

药物对接仿真软件:HADDOCK_(3).分子对接基本原理

分子对接(Molecular Docking)是计算化学和结构生物学中的一种重要技术,用于预测小分子(如药物分子)与大分子(如蛋白质)之间的相互作用模式和结合亲和力。这一技术在药物设计和开发中具有广泛的应用,尤其是在寻找和优化潜在的药物候选物方面。本节将详细介绍分子对接的基本原理,包括其理论基础、计算方法和应用。

kkchenjj的博客 1171

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

x264源码分析与应用示例(一)——视频编码基本流程

x264源码分析与应用示例(一)——视频编码基本流程

m0_60259116的博客 2211

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

上一篇: 访问单个节点的删除
下一篇: VS2013无法找到.exe文件
yang-彧
博客等级 码龄12年 105粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值