使用ffmpeg进行图像格式转换以及图像缩放/sws_scale/linux/c++/c/rgb-yuv420

来源:互联网 发布:it猎头公司 编辑:程序博客网 时间:2024/06/05 16:36

  利用ffmpeg进行图像数据格式的转换以及图片的缩放应用中,主要用到了swscale.h文件中的三个函数,分别是:

      struct SwsContext *sws_getContext(int srcW, int srcH, enum AVPixelFormat srcFormat,
                               int dstW, int dstH, enum AVPixelFormat dstFormat,
                               int flags, SwsFilter *srcFilter,
                               SwsFilter *dstFilter, const double *param);

      int sws_scale(struct SwsContext *c, const uint8_t *const srcSlice[],

                     const int srcStride[], int srcSliceY, int srcSliceH,
                   uint8_t *const dst[], const int dstStride[]);

      void sws_freeContext(struct SwsContext *swsContext);

  sws_getContext函数可以看做是初始化函数,它的参数定义分别为:

      int srcW,int srcH 为原始图像数据的高和宽;

      int dstW,int dstH 为输出图像数据的高和宽;

      enum AVPixelFormat srcFormat 为输入和输出图片数据的类型;eg:AV_PIX_FMT_YUV420、PAV_PIX_FMT_RGB24;

      int flags 为scale算法种类;eg:SWS_BICUBIC、SWS_BICUBLIN、SWS_POINT、SWS_SINC;

      SwsFilter *srcFilter ,SwsFilter *dstFilter,const double *param 可以不用管,全为NULL即可;

  sws_scale函数则为执行函数,它的参数定义分别为:

      struct SwsContext *c 为sws_getContext函数返回的值;

      const uint8_t *const srcSlice[],uint8_t *const dst[] 为输入输出图像数据各颜色通道的buffer指针数组;

      const int srcStride[],const int dstStride[] 为输入输出图像数据各颜色通道每行存储的字节数数组;     

      int srcSliceY 为从输入图像数据的第多少列开始逐行扫描,通常设为0;

      int srcSliceH 为需要扫描多少行,通常为输入图像数据的高度;

  sws_freeContext函数为结束函数,它的参数即为sws_getContext函数返回的值;

  示例代码:rgb24_2_rgb24/1600*1200—352*288

//.h

#ifndef INT64_C#define INT64_C#define UINT64_C#endifextern "C"{#include "libswscale/swscale.h"}struct ImgInfo{    unsigned int height;    unsigned int width;    unsigned long bufferSize;    unsigned char *bufferPtr;}rawDate;

//.cpp

    int nSrcH = rawData.height;  //1200    int nSrcW = rawData.width;   //1600    int nDstH = RESIZED_HIGHT;   //258    int nDstW = RESIZED_WIDTH;   //352    uint8_t *pSrcBuff[3] = {rawData.bufferPtr, rawData.bufferPtr  + nSrcW * nSrcH, rawData.bufferPtr  + nSrcW * nSrcH * 2};    uint8_t *pDstBuff[3] = {pResizedData->bufferPtr, pResizedData->bufferPtr + nDstW * nDstH, pResizedData->bufferPtr + nDstW * nDstH * 2};           int nSrcStride[3];    int nDstStride[3];        for (int i=0; i<3; i++)    {    nSrcStride[i] = nSrcW * 3;    nDstStride[i] = nDstW * 3;    }        SwsContext*m_pSwsContext;        m_pSwsContext = sws_getContext(nSrcW, nSrcH, AV_PIX_FMT_RGB24,                                  nDstW, nDstH, AV_PIX_FMT_RGB24,                                  SWS_SINC,                                   NULL, NULL, NULL);                                      if (NULL == m_pSwsContext)     {    printf("ffmpeg get context error!\n");    return false;    }        sws_scale(m_pSwsContext, pSrcBuff,              nSrcStride, 0, nSrcH,              pDstBuff, nDstStride);                  sws_freeContext(m_pSwsContext);

示例代码:rgb24_2_yuv420/1600*1200—352*288

//.cpp

    int nSrcH = rawData->height;   //1200    int nSrcW = rawData->width;    //1600    int nDstH = RESIZED_HIGHT;    //288    int nDstW = RESIZED_WIDTH;    //352    uint8_t *pSrcBuff[3] = {rawData->bufferPtr, rawData->bufferPtr  + nSrcW * nSrcH, rawData->bufferPtr  + nSrcW * nSrcH * 2};    uint8_t *pDstBuff[3] = {resizedYuvData->bufferPtr, resizedYuvData->bufferPtr + nDstW * nDstH, resizedYuvData->bufferPtr + nDstW * nDstH * 5 / 4};           int nSrcStride[3];    int nDstStride[3];        for (int i=0; i<3; i++)    {    nSrcStride[i] = nSrcW * 3;    }        nDstStride[0] = nDstW;    nDstStride[1] = nDstW / 2;    nDstStride[2] = nDstW / 2;        SwsContext*m_pSwsContext;        m_pSwsContext = sws_getContext(nSrcW, nSrcH, AV_PIX_FMT_RGB24,                                  nDstW, nDstH, AV_PIX_FMT_YUV420P,                                  SWS_SINC,                                   NULL, NULL, NULL);                                      if (NULL == m_pSwsContext)     {    printf("ffmpeg get context error!\n");    return false;    }        sws_scale(m_pSwsContext, pSrcBuff,              nSrcStride, 0, nSrcH,              pDstBuff, nDstStride);                  sws_freeContext(m_pSwsContext);




原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 肾结石掉在输尿管里面好痛怎么办 寄的快递快递单号找不到了怎么办 手机停机但是快递是这个号码怎么办 百世通快递卡在一个地方没动怎么办 电信无限流量20g用完了怎么办 至尊宝qq密保手机被更换怎么办 至尊宝账户密保手机被改怎么办 照片放到私密相册找不到了怎么办 出口报关报错境内货源地怎么办? 微信提现未到账交易记录删了怎么办 支付宝忘记密码就可以登陆怎么办 电脑上登陆QQ忘记密码了怎么办? 电脑被管理员限制登录微信了怎么办 快手绑定的手机号丢了登不上怎么办 快手绑定的手机号丢了登不了怎么办 苹果id有手机号不知道密码怎么办 微信号不是手机号不知道密码怎么办 手机发短信说程序发生错误怎么办 派派游戏崇物等级低怎么办 轻微事故没有报警后面有问题怎么办 苹果6sp手机接电话声音小怎么办 用手机号办的移动宽带到期了怎么办 联通忘了宽带的用户名和密码怎么办 宽带联通移机附近没有端口怎么办 电信卡怎么改服务密码忘记了怎么办 路由器重置宽带账号密码忘了怎么办 重置路由器后不知道宽带密码怎么办 欠费后重新缴费宽带连接不了怎么办 华硕路由器忘记账号密码忘了怎么办 光纤猫光信号闪红灯不能上网怎么办 被传销洗了脑的人怎么办 辞职了评职称年度考核表怎么办 我是饭店饭店欠供货商的钱多怎么办 mac电脑ps卡住了点不了怎么办 高考自愿民族栏要改为民族怎么办 法院拆消裁定后再审有错怎么办 重定向语句前面有文件路劲怎么办 您上传的图片大小超过3M怎么办 两个人打架被拍视频上传了怎么办 小米手机打开后一直出现英文怎么办 百度云分享文件含有违规内容怎么办