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


    FFMPEG中的swscale提供了视频原始数据(YUV420,YUV422,YUV444,RGB24...)之间的转换,分辨率变换等操作,使用起来十分方便,在这里记录一下它的用法。

    swscale主要用于在2个AVFrame之间进行转换。
    下面来看一个视频解码的简单例子,这个程序完成了对"北京移动开发者大会茶歇视频2.flv"(其实就是优酷上的一个普通视频)的解码工作,并将解码后的数据保存为原始数据文件(例如YUV420,YUV422,RGB24等等)。其中略去了很多的代码。
    解码H264
     int i;  //YUV420
     for(i=0;i<576;i++)  
     {//fwrite(buf + i * wrap, 1, xsize, f);  
          memcpy(overlay->pixels[0]+i*1280, pFrame_->data[0]+i*pFrame_->linesize[0], 720);                                 
      }  
      for(i=0;i<288;i++)  
      {  
          memcpy(overlay->pixels[2]+i*640, pFrame_->data[1]+i*pFrame_->linesize[1], 360);  
           memcpy(overlay->pixels[1]+i*640, pFrame_->data[2]+i*pFrame_->linesize[2], 360); 
      }                                     
    代码转换yuv422
     int k=0,y,x;    //yuv420  -> yuv422  
           for( y=0;y<576;y++)  
           {  
                for( x=0;x<720;x++)  
                {  
                     yuv422[k++] = pFrame_->data[0][y*pFrame_->linesize[0]+x];  
                     yuv422[k++] = x%2==0?pFrame_->data[1][(y/2)*pFrame_->linesize[1]+x/2]:pFrame_->data[2][(y/2)*pFrame_->linesize[2]+x/2];  
                }  
           }  
               
             memcpy(overlay->pixels[0],yuv422, codec_->width*codec_->height*2);  
    采用swscale转换
     int numBytes = avpicture_get_size(AV_PIX_FMT_YUYV422, codec_->width,    
                                      codec_->height);    
        uint8_t* yuv422 = (uint8_t *)av_malloc(numBytes*sizeof(uint8_t));    
            
        avpicture_fill((AVPicture *)pFrameYUV, yuv422, AV_PIX_FMT_YUYV422,    
                       codec_->width, codec_->height); 
    
    
    //while
    
    
    img_convert_ctx = sws_getContext(codec_->width, codec_->height, codec_->pix_fmt, codec_->width, codec_->height, AV_PIX_FMT_YUYV422, 2, NULL, NULL, NULL);     
     sws_scale(img_convert_ctx, (const uint8_t* const*) pFrame_->data,  pFrame_->linesize, 0, codec_->height, pFrameYUV->data,pFrameYUV->linesize);    
      
    memcpy(overlay->pixels[0],yuv422, codec_->width*codec_->height*2);  
    
  • 相关阅读:
    xcode 4.2 运行 4.3 simulator出错, dyld: Library not loaded: /usr/lib/libc++abi.dylib
    Mathematica 进阶 自定义抽象矩阵运算
    php正则表达式函数 preg_replace用法
    jQuery DIV圆角插件之jquery.corner.js jQuery插件怎么用?
    JQuery获取和设置Select选项方法
    javascript+css无刷新实现页面样式的更换
    Nginx 高性能的 HTTP 和 反向代理 服务器
    240多个jquery插件
    imgPreview在线预览
    Linux下查看apache连接数
  • 原文地址:https://www.cnblogs.com/mao0504/p/5669001.html
Copyright © 2020-2023  润新知