精华内容
下载资源
问答
  • ffmpeg缩放视频尺寸

    千次阅读 2020-08-05 16:05:35
    FFmpeg有一个非常强大的缩放过滤器,可用于完成各种任务。其中一些列在这里。更多信息可以在官方文档中找到。 在所有示例中,起始图像(input.jpg)将是这一个(535⨉346像素): 简单重新缩放 如果您只需将...

    FFmpeg有一个非常强大的缩放过滤器,可用于完成各种任务。其中一些列在这里。更多信息可以在官方文档中找到。

    在所有示例中,起始图像(input.jpg)将是这一个(535⨉346像素):

     

    简单重新缩放

    如果您只需将视频大小调整为特定大小(例如320⨉240),则可以使用最基本形式的缩放滤镜:

    ffmpeg -i input.avi -vf scale = 320:240 output.avi
    

    同样适用于图像:

    ffmpeg -i input.jpg -vf scale = 320:240 output_320x240.png
    
    

     

    如您所见,纵横比与原始图像不同,因此图像显示为拉伸。

    保持宽高比

    如果我们想保持纵横比,我们只需要指定一个组件(宽度或高度),并将另一个组件设置为-1。例如,这个命令行:

    ffmpeg -i input.jpg -vf scale = 320:-1 output_320.png
    

    将输出图像的宽度设置为320像素,并根据输入图像的宽高比计算输出图像的高度。生成的图像的尺寸为320×207像素。

     

    一些编解码器要求宽度和高度的大小为n的倍数。您可以通过将宽度或高度设置为-n来实现此目的:

    ffmpeg -i input.jpg -vf scale = 320:-2 output_320.png
    

    输出现在为320⨉206像素。

    使用变量

    还有一些有用的变量可用于代替数字,以指定输出图像的宽度和高度。

    例如,如果要以这样的方式拉伸图像以仅使输入图像的宽度加倍,则可以使用类似这样的内容(iw =输入宽度,ih =输入高度):

    ffmpeg -i input.jpg -vf scale = iw * 2:ih input_double_width.png
    
    

     

    如果你想要图片大小的一半,只需乘以.5或除以2:

    ffmpeg -i input.jpg -vf“scale = iw * .5:ih * .5”input_half_size.png
    ffmpeg -i input.jpg -vf“scale = iw / 2:ih / 2”input_half_size.png
    

    避免升级

    有时您想要缩放图像,但如果尺寸太小,请避免放大图像。这可以使用min表达式完成:

    ffmpeg -i input.jpg -vf“scale ='min(320,iw)':'min(240,ih)'”input_not_upscaled.png
    

    输出宽度将被评估为320的最小值和输入宽度。如果您的输入图像宽度仅为240像素,则min函数的结果将为240 - 这将是您的目标值。

    适合矩形/静态大小的播放器

    有时您需要缩放输入图像以使其适合指定的矩形,例如在合并来自不同来源的材料时。

    您可以使用force_original_aspect_ratio选项实现此目的。它有两个可能的值:

    • 减少:如果需要,输出视频尺寸将自动减小。
    • 增加:如果需要,输出视频尺寸将自动增加。

    这允许您强制图像适合320x240框,使用正确的宽高比缩小它:

    ffmpeg -i input.jpg -vf scale = w = 320:h = 240:force_original_aspect_ratio =减少output_320.png
    

    这产生了我们之前看到的320x207图像。

     

    您可能有其他约束,例如添加黑条(柱状和letterboxing)以在缩放到某个矩形时填充剩余空间。您还可以使用pad过滤器添加黑色边框:

    ffmpeg -i input.jpg -vf“scale = 320:240:force_original_aspect_ratio = decrease,pad = 320:240:(ow-iw)/ 2:(oh-ih)/ 2”output_320_padding.png
    

    更多的例子可以发现在这个超级用户答案

    指定缩放算法

    您可以使用-sws_flags选项指定用于调整大小的算法。例如,要使用双线性而不是默认的双三次缩放:

    ffmpeg -i test.tif -vf scale = 504:376 -sws_flags bilinear out.bmp
    

    有关详细信息,请参阅缩放器文档。要设置多个标志,您可以将它们与+号组合。例如:

    -sws_flags lanczos + full_chroma_inp
    

    您还可以直接在比例过滤器中指定选项,例如:

    -vf scale = 1920x1080:flags = lanczos
    展开全文
  • FFmpeg缩放swscale函数

    2017-11-10 13:13:59
    利用ffmpeg进行图像数据格式的转换以及图片缩放应用中,主要用到了swscale.h文件中的三个函数,分别是: struct SwsContext *sws_getContext(int srcW, int srcH, enum AVPixelFormat srcFormat, int dstW,...

    利用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函数返回的值;

           做一个实际缩放YUV420函数打包实例如下:

    复制代码
    int ScaleImg(AVCodecContext *pCodecCtx,AVFrame *src_picture,AVFrame *dst_picture,int nDstH ,int nDstW )
    {
    int i ;
    int nSrcStride[3];
    int nDstStride[3];
    int nSrcH = pCodecCtx->height;
    int nSrcW = pCodecCtx->width;
    struct SwsContext* m_pSwsContext;
    
    
    uint8_t *pSrcBuff[3] = {src_picture->data[0],src_picture->data[1], src_picture->data[2]};
    
    
    nSrcStride[0] = nSrcW ;
    nSrcStride[1] = nSrcW/2 ;
    nSrcStride[2] = nSrcW/2 ;
    
    
    
    
    dst_picture->linesize[0] = nDstW;
    dst_picture->linesize[1] = nDstW / 2;
    dst_picture->linesize[2] = nDstW / 2;
    
    
    printf("nSrcW%d\n",nSrcW);
    
    
    m_pSwsContext = sws_getContext(nSrcW, nSrcH, PIX_FMT_YUV420P,
    nDstW, nDstH, PIX_FMT_YUV420P,
    SWS_BICUBIC,
    NULL, NULL, NULL);
    
    
    if (NULL == m_pSwsContext)
    {
    printf("ffmpeg get context error!\n");
    exit (-1);
    }
    
    
    sws_scale(m_pSwsContext, src_picture->data,src_picture->linesize, 0, pCodecCtx->height,dst_picture->data,dst_picture->linesize);
    
    
    printf("line0:%d line1:%d line2:%d\n",dst_picture->linesize[0] ,dst_picture->linesize[1] ,dst_picture->linesize[2]);
    sws_freeContext(m_pSwsContext);
    
    
    return 1 ;
    }
    复制代码

    函数很简单,申请环境初始指针,后缩放即可。读到此文的朋友,这个函数可以直接拷贝使用哟。如果有疑问可以留言或者邮件:leoluopy@gmail.com

     

    RGB的缩放可以参考下面:

    复制代码
    int ScaleYUVImgToRGB(int nSrcW,int nSrcH ,uint8_t* src_data,int *linesize,int nDstW ,int nDstH )  
    {  
        int i ; int ret ;  FILE *nRGB_file ;
    
        AVFrame *nDst_picture ;
        struct SwsContext* m_pSwsContext;  
    
        nDst_picture = avcodec_alloc_frame();
        if (!nDst_picture){
            printf("nDst_picture avcodec_alloc_frame failed\n");
            exit(1);
        }
        if(avpicture_alloc((AVPicture *)nDst_picture,PIX_FMT_RGB24,nDstW, nDstH)<0){
            printf("dst_picture avpicture_alloc failed\n");
            exit(1);
        }
        m_pSwsContext = sws_getContext(nSrcW, nSrcH, PIX_FMT_YUV420P,  
            nDstW, nDstH, PIX_FMT_RGB24,  
            SWS_BICUBIC,  
            NULL, NULL, NULL);  
    
        if (NULL == m_pSwsContext)  
        {  
            printf("ffmpeg get context error!\n");  
            exit (-1);  
        }   
    
        ret = sws_scale(m_pSwsContext, src_data,linesize, 0,nSrcH,nDst_picture->data,nDst_picture->linesize);  
    
        nRGB_file = fopen("..\\YUV_STREAM\\RGBFile.rgb","ab+");
        fwrite(nDst_picture->data[0],nDstW*nDstH*3,1,nRGB_file);
        fclose(nRGB_file);
    
        sws_freeContext(m_pSwsContext);  
        avpicture_free((AVPicture *)nDst_picture);
    
        return 0;  
    }
    复制代码

    参数data  和 linesize 参考yuv平面指针即可。

     

     同时如果不想使用AVPicture结构的话,可以参考下面的:(注意不同图像类型,linesize一定要写对)

    复制代码
    char* H264Decoder_c::ScaleYUVImgToRGB(int nSrcW,int nSrcH ,uint8_t** src_data,int *linesize,int nDstW ,int nDstH )
    {
        int i ; int ret ;  FILE *nRGB_file ;
    
        struct SwsContext* m_pSwsContext;
        char*  out_Img[3];
        int out_linesize[3];
        out_linesize[0] = 2*nDstW ; //out_linesize[1] = nDstW ;out_linesize[2] = nDstW ;
        out_Img[0] = g_RGBImg ;
    
        m_pSwsContext = sws_getContext(nSrcW, nSrcH, PIX_FMT_YUV420P,
            nDstW, nDstH, PIX_FMT_RGB565,
            SWS_BICUBIC,
            NULL, NULL, NULL);
    
        if (NULL == m_pSwsContext)
        {
            printf("ffmpeg get context error!\n");
            exit (-1);
        }
    
        ret = sws_scale(m_pSwsContext, src_data,linesize, 0,nSrcH,(uint8_t**)out_Img,out_linesize);
    #if 0
        nRGB_file = fopen("./RGBFile.rgb","ab+");
        fwrite(out_Img[0],nDstW*nDstH*2,1,nRGB_file);
        fclose(nRGB_file);
    
    #endif
    
        sws_freeContext(m_pSwsContext);
    
        return out_Img[0];
    }
    复制代码

    目的位图的空间申请:

           注意:上面的缩放函数如果直接使用而在没有解码成功或者没有申请目的位图空间时,将报段错误。

          原因:没有解码成功,位图源地址将是指向空的地址,目的位图地址同样。   

          申请目的位图的方式:

    复制代码
    dst_picture = avcodec_alloc_frame();
    if (!dst_picture){
    return ;
    }
    if(avpicture_alloc((AVPicture *)dst_picture, c->pix_fmt,c->width*2, c->height*2)<0){
    printf("dst_picture allocate failed\n");
    exit(1);
    }
    复制代码

    初始化后即可以用于缩放了。

     

     

    图像的内存Dump方法:

            上文已经比较详细的阐述了ffmpeg的解码以及缩放原理及流程,然而在实际运用环境中,无论是从实时播放或者是从历史回放来看,我们需要的是像素位图,而不是ffmpeg的结构体。那么怎么转换呢?下文介绍了相关的内容。

     

            作为实际运用环境中,像素位图格式,笔者使用的是比较常用的YUV格式。

     

            编解码图像格式

              承接上文继续,在大部分现场环境下,为了节省传送带宽以及提高系统工作效率,视频原始位图格式以及解码后展示格式一般使用YUV420。
              其中YV12以及IYUV是最常见的格式。
              简单的说,YUV格式又分为平面格式以及打包格式。他们各有利弊。本文使用的是YUV平面格式即三通道分别使用不同入口地址存储,这样的好处是,与ffmpeg解码接口方面,AVFrame中数据结构可以便捷拷贝图像信息。

             YV12:

         

             IYUV 

     
     
              这里做简单的叙述:详细可以参考:
     

     

              http://blog.csdn.net/searchsun/article/details/2443867

     

         如何Dump

               好了,对YUV格式又初步了解后,下面介绍如果导出这像素位图数据。ffmpeg将图像的亮度以及色差信息保存在AVFrame中的data[0]、data[1]、data[2]中。

              详细参考:

     

    AVFrame和AVPicture对比:

    http://yul100887.blog.163.com/blog/static/200336135201211143525930/

     

               所有操作均是针对这三个指针展开的,如下:

    pgm_save(picture->data[0], picture->linesize[0], //Y
    c->width, c->height, outfilename);
    pgm_save(picture->data[1], picture->linesize[1],
    c->width/2, c->height/2, outfilename); //U
    pgm_save(picture->data[2], picture->linesize[2],
    c->width/2, c->height/2, outfilename);  //V
    复制代码
    void pgm_save(unsigned char *buf,int wrap, int xsize,int ysize,char *filename)
    {
        FILE *f;
        int i;
    
    
    f=fopen(filename,"ab+");   
    
    
    for(i=0;i<ysize;i++)
    {
    fwrite(buf + i * wrap, 1, xsize, f ); 
    }
    fclose(f);
    }
    复制代码

     代码对YUV三个像素通道分开dump,读者可以根据自己的需要对函数进行包装。data[0] 是亮度信息入口指针,同时传入图像长宽,以及存储内存区域行宽。 data[1]  data[2] 类似。

     

                    最后需要注意的是:linesize总是容易被遗忘,livesize[0]=height ,livesize[1]=height/2 ,livesize[2]=height /2,

    ==================================================================================

    原帖地址:http://blog.csdn.net/gubenpeiyuan/article/details/19548019?utm_source=tuicool

    其参考地址:

    参考文章:

     

    使用ffmpeg进行图像格式转换及缩放

    http://blog.csdn.net/skys_broyal/article/details/10337147

    AVFrame和AVPicture对比:

    http://yul100887.blog.163.com/blog/static/200336135201211143525930/

    FFMPEG 实现 YUV,RGB各种图像原始数据之间的转换(swscale)

    http://blog.csdn.net/leixiaohua1020/article/details/14215391

    ffmpeg编解码H264

    http://blog.csdn.net/chinabinlang/article/details/7088590

    h264检测是I帧还是P帧

    http://blog.csdn.net/zgyulongfei/article/details/7558031

    展开全文
  • 利用ffmpeg进行图像数据格式的转换以及图片缩放应用中,主要用到了swscale.h文件中的三个函数,分别是: struct SwsContext *sws_getContext(int srcW, int srcH, enum AVPixelFormat srcFormat,

    缩放:

               

    利用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函数返回的值;

           做一个实际缩放YUV420函数打包实例如下:

    复制代码
    int ScaleImg(AVCodecContext *pCodecCtx,AVFrame *src_picture,AVFrame *dst_picture,int nDstH ,int nDstW )
    {
    int i ;
    int nSrcStride[3];
    int nDstStride[3];
    int nSrcH = pCodecCtx->height;
    int nSrcW = pCodecCtx->width;
    struct SwsContext* m_pSwsContext;
    
    
    uint8_t *pSrcBuff[3] = {src_picture->data[0],src_picture->data[1], src_picture->data[2]};
    
    
    nSrcStride[0] = nSrcW ;
    nSrcStride[1] = nSrcW/2 ;
    nSrcStride[2] = nSrcW/2 ;
    
    
    
    
    dst_picture->linesize[0] = nDstW;
    dst_picture->linesize[1] = nDstW / 2;
    dst_picture->linesize[2] = nDstW / 2;
    
    
    printf("nSrcW%d\n",nSrcW);
    
    
    m_pSwsContext = sws_getContext(nSrcW, nSrcH, PIX_FMT_YUV420P,
    nDstW, nDstH, PIX_FMT_YUV420P,
    SWS_BICUBIC,
    NULL, NULL, NULL);
    
    
    if (NULL == m_pSwsContext)
    {
    printf("ffmpeg get context error!\n");
    exit (-1);
    }
    
    
    sws_scale(m_pSwsContext, src_picture->data,src_picture->linesize, 0, pCodecCtx->height,dst_picture->data,dst_picture->linesize);
    
    
    printf("line0:%d line1:%d line2:%d\n",dst_picture->linesize[0] ,dst_picture->linesize[1] ,dst_picture->linesize[2]);
    sws_freeContext(m_pSwsContext);
    
    
    return 1 ;
    }
    复制代码

    函数很简单,申请环境初始指针,后缩放即可。读到此文的朋友,这个函数可以直接拷贝使用哟。如果有疑问可以留言或者邮件:leoluopy@gmail.com

     

    RGB的缩放可以参考下面:

    复制代码
    int ScaleYUVImgToRGB(int nSrcW,int nSrcH ,uint8_t* src_data,int *linesize,int nDstW ,int nDstH )  
    {  
        int i ; int ret ;  FILE *nRGB_file ;
    
        AVFrame *nDst_picture ;
        struct SwsContext* m_pSwsContext;  
    
        nDst_picture = avcodec_alloc_frame();
        if (!nDst_picture){
            printf("nDst_picture avcodec_alloc_frame failed\n");
            exit(1);
        }
        if(avpicture_alloc((AVPicture *)nDst_picture,PIX_FMT_RGB24,nDstW, nDstH)<0){
            printf("dst_picture avpicture_alloc failed\n");
            exit(1);
        }
        m_pSwsContext = sws_getContext(nSrcW, nSrcH, PIX_FMT_YUV420P,  
            nDstW, nDstH, PIX_FMT_RGB24,  
            SWS_BICUBIC,  
            NULL, NULL, NULL);  
    
        if (NULL == m_pSwsContext)  
        {  
            printf("ffmpeg get context error!\n");  
            exit (-1);  
        }   
    
        ret = sws_scale(m_pSwsContext, src_data,linesize, 0,nSrcH,nDst_picture->data,nDst_picture->linesize);  
    
        nRGB_file = fopen("..\\YUV_STREAM\\RGBFile.rgb","ab+");
        fwrite(nDst_picture->data[0],nDstW*nDstH*3,1,nRGB_file);
        fclose(nRGB_file);
    
        sws_freeContext(m_pSwsContext);  
        avpicture_free((AVPicture *)nDst_picture);
    
        return 0;  
    }
    复制代码

    参数data  和 linesize 参考yuv平面指针即可。

     

     同时如果不想使用AVPicture结构的话,可以参考下面的:(注意不同图像类型,linesize一定要写对)

    复制代码
    char* H264Decoder_c::ScaleYUVImgToRGB(int nSrcW,int nSrcH ,uint8_t** src_data,int *linesize,int nDstW ,int nDstH )
    {
        int i ; int ret ;  FILE *nRGB_file ;
    
        struct SwsContext* m_pSwsContext;
        char*  out_Img[3];
        int out_linesize[3];
        out_linesize[0] = 2*nDstW ; //out_linesize[1] = nDstW ;out_linesize[2] = nDstW ;
        out_Img[0] = g_RGBImg ;
    
        m_pSwsContext = sws_getContext(nSrcW, nSrcH, PIX_FMT_YUV420P,
            nDstW, nDstH, PIX_FMT_RGB565,
            SWS_BICUBIC,
            NULL, NULL, NULL);
    
        if (NULL == m_pSwsContext)
        {
            printf("ffmpeg get context error!\n");
            exit (-1);
        }
    
        ret = sws_scale(m_pSwsContext, src_data,linesize, 0,nSrcH,(uint8_t**)out_Img,out_linesize);
    #if 0
        nRGB_file = fopen("./RGBFile.rgb","ab+");
        fwrite(out_Img[0],nDstW*nDstH*2,1,nRGB_file);
        fclose(nRGB_file);
    
    #endif
    
        sws_freeContext(m_pSwsContext);
    
        return out_Img[0];
    }
    复制代码

    目的位图的空间申请:

           注意:上面的缩放函数如果直接使用而在没有解码成功或者没有申请目的位图空间时,将报段错误。

          原因:没有解码成功,位图源地址将是指向空的地址,目的位图地址同样。   

          申请目的位图的方式:

    复制代码
    dst_picture = avcodec_alloc_frame();
    if (!dst_picture){
    return ;
    }
    if(avpicture_alloc((AVPicture *)dst_picture, c->pix_fmt,c->width*2, c->height*2)<0){
    printf("dst_picture allocate failed\n");
    exit(1);
    }
    复制代码

    初始化后即可以用于缩放了。

     

     

    图像的内存Dump方法:

            上文已经比较详细的阐述了ffmpeg的解码以及缩放原理及流程,然而在实际运用环境中,无论是从实时播放或者是从历史回放来看,我们需要的是像素位图,而不是ffmpeg的结构体。那么怎么转换呢?下文介绍了相关的内容。

     

            作为实际运用环境中,像素位图格式,笔者使用的是比较常用的YUV格式。

     

            编解码图像格式

              承接上文继续,在大部分现场环境下,为了节省传送带宽以及提高系统工作效率,视频原始位图格式以及解码后展示格式一般使用YUV420。
              其中YV12以及IYUV是最常见的格式。
              简单的说,YUV格式又分为平面格式以及打包格式。他们各有利弊。本文使用的是YUV平面格式即三通道分别使用不同入口地址存储,这样的好处是,与ffmpeg解码接口方面,AVFrame中数据结构可以便捷拷贝图像信息。

             YV12:

         

             IYUV 

     
     
              这里做简单的叙述:详细可以参考:
     

     

              http://blog.csdn.net/searchsun/article/details/2443867

     

         如何Dump

               好了,对YUV格式又初步了解后,下面介绍如果导出这像素位图数据。ffmpeg将图像的亮度以及色差信息保存在AVFrame中的data[0]、data[1]、data[2]中。

              详细参考:

     

    AVFrame和AVPicture对比:

    http://yul100887.blog.163.com/blog/static/200336135201211143525930/

     

               所有操作均是针对这三个指针展开的,如下:

    pgm_save(picture->data[0], picture->linesize[0], //Y
    c->width, c->height, outfilename);
    pgm_save(picture->data[1], picture->linesize[1],
    c->width/2, c->height/2, outfilename); //U
    pgm_save(picture->data[2], picture->linesize[2],
    c->width/2, c->height/2, outfilename);  //V
    复制代码
    void pgm_save(unsigned char *buf,int wrap, int xsize,int ysize,char *filename)
    {
        FILE *f;
        int i;
    
    
    f=fopen(filename,"ab+");   
    
    
    for(i=0;i<ysize;i++)
    {
    fwrite(buf + i * wrap, 1, xsize, f ); 
    }
    fclose(f);
    }
    复制代码

     代码对YUV三个像素通道分开dump,读者可以根据自己的需要对函数进行包装。data[0] 是亮度信息入口指针,同时传入图像长宽,以及存储内存区域行宽。 data[1]  data[2] 类似。

     

                    最后需要注意的是:linesize总是容易被遗忘,livesize[0]=height ,livesize[1]=height/2 ,livesize[2]=height /2,

    ==================================================================================

    原帖地址:http://blog.csdn.net/gubenpeiyuan/article/details/19548019?utm_source=tuicool

    其参考地址:

    参考文章:

     

    使用ffmpeg进行图像格式转换及缩放

    http://blog.csdn.net/skys_broyal/article/details/10337147

    AVFrame和AVPicture对比:

    http://yul100887.blog.163.com/blog/static/200336135201211143525930/

    FFMPEG 实现 YUV,RGB各种图像原始数据之间的转换(swscale)

    http://blog.csdn.net/leixiaohua1020/article/details/14215391

    ffmpeg编解码H264

    http://blog.csdn.net/chinabinlang/article/details/7088590

    h264检测是I帧还是P帧

    http://blog.csdn.net/zgyulongfei/article/details/7558031

    展开全文
  • ffmpeg -framerate 25 -loop 1 -i 1.jpg -filter_complex "[0:v]scale=8000x4000,zoompan=z='min(zoom+0.0015,1.5)':x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)':d=125:s=800x800,trim=duration=5[v1];[v1]scale=-2:...

     

    ffmpeg -framerate 25 -loop 1 -i 1.jpg -filter_complex "[0:v]scale=8000x4000,zoompan=z='min(zoom+0.0015,1.5)':x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)':d=125:s=800x800,trim=duration=5[v1];[v1]scale=-2:480[v]" -map "[v]" -y 放大滑动.mp4

    代码:

    ffmpeg -framerate 25 -loop 1 -i 1.jpg -filter_complex "[0:v]scale=8000x4000,zoompan=z='min(zoom+0.0015,1.5)':x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)':d=125:s=800x800,trim=duration=5[v1];[v1]scale=-2:480[v]" -map "[v]" -y 放大滑动.mp4


    如果代码中不加入:s=800x800的话,转换后的视频分辨率则为:1280 x 720。

    展开全文
  • Using FFmpeg I am trying to resize to a square but I am having much difficulty. <p>if i use s=320x320 in my command or scale 320x320 <pre><code> ->setVideoScale(320, 320) </code></pre> <p>the ...
  • 技术交流使用ffmpeg图片批量合成抖音卡点短视频ffmpeg工具准备图片和音乐文件准备ffmpeg命令行合成图片短视频合成的效果 使用ffmpeg图片批量合成抖音卡点短视频 近期在研究用批量用图片和音乐合成抖音小红书的卡...
  • 我在win7系统 vs2010下 用最新的ffmpegffmpeg-3.0.2将1440*896的rgb24的格式缩放成1360*768的yuv420p,转换之后的图像左边会有条纹 源代码如下: void Rgb24ToYuv420(int nSrcW,int nSrcH,BYTE* pRgbData,...
  • ffmpeg 对图像数据格式以及图片缩放

    千次阅读 2017-11-08 15:37:43
    利用ffmpeg进行图像数据格式的转换以及图片缩放应用中,主要用到了swscale.h文件中的三个函数,分别是: struct SwsContext *sws_getContext(int srcW, int srcH, enum AVPixelFormat srcFormat, int dstW, ...
  • FFMPEG 图像拉伸缩放及数据格式转换

    千次阅读 2018-04-24 11:10:40
    在做摄像头数据采集处理的时候,经常会遇到摄像头输入数据格式的...但是在FFMPEG中,它就已经包含了图像格式转换的接口,同时它还带有图像拉伸缩放的功能。下面代码实现了任意数据格式的转换和任意尺寸的缩放。/*...
  • FFmpeg】 图像缩放

    千次阅读 2018-04-10 14:43:28
    在用FFmpeg时遇到需要将截屏的图像(1920*1080)转换为 1024*768的问题。//截屏的编码上下文 //假设这里视频截图分辨率为1920*1080 AVCodecContext *pVideoCodecCtx = m_pVideoFormatCtx-&gt;streams...
  • namespace ffmpeg{ extern "C" { #include #include #include #include #include #include } } using namespace ffmpeg; struct JpgProcessParam { AVFormatContext *fmt_ctx; AVCodecContext *video_dec_...
  • ffmpeg

    2021-07-10 16:24:05
    本文采用[知识共享署名 4.0 国际许可协议](http://creativecommons.org/licenses/by/4.0/)进行许可,转载时请注明原文链接,图片在使用时请保留全部内容,可适当缩放并在引用处附上图片所在的文章链接。 安装 ...
  • http://www.cnblogs.com/yongfengnice/p/7095846.html http://blog.csdn.net/u011913612/article/details/54314612
  • FFMPEG

    2019-04-13 11:16:38
    FFMPEG是特别强大的专门用于处理音视频的开源库。你既可以使用它的API对音视频进行处理,也可以使用它提供的工具,如 ffmpeg, ffplay, ffprobe,来编辑你的音视频文件。 本文将简要介绍一下 FFMPEG 库的基本目录结构...
  • FFmpeg

    2019-04-25 09:48:42
    Mac安装FFmpeg,先安装...程序自动先执行update brew,然后下载FFmpeg依赖,比较多,时间比较久,网速不错的可能2.3个小时,下载依赖如下: 等到终端执行完毕的时候,执行: ffmpeg -version 安装完成会输出以...
  • 一、使用convert命令实现图片缩放 工作需求:在用户上传图片和视频时进行异步处理,如果上传的是图片,生成一张中等比例的图片和一张小的缩略图。最终的结果,存储一张原图,一张中等比例的图片,一张缩略图。如果...
  • FFmpeg处理视频或图片

    2021-07-02 17:32:19
    FFmpeg解析视频: 将mp4视频,一帧帧保存为jpg格式的图片 命令行方式: 1、 一秒取一帧图片:r = 1 ffmpeg -i input.mp4 -f image2 -r 1 dstPath/image-%03d.jpg 2、 提取I帧 ffmpeg -i input.mp4 -an -vf select=...
  • FFmpeg滤镜:制作图片视频流

    万次阅读 2019-03-21 21:12:44
    那么,怎样才能把多张照片转成一个视频文件呢? 使用FFmpeg可以这么来做: ffmpeg -f image2 -framerate 0.5 -i D:\MTest\IMG%02d.jpg -s 720x480 -r 15 D:\MTest\outimgs....首先,你要把源图片放在同一个文件夹...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,497
精华内容 1,398
关键字:

ffmpeg缩放图片