美文网首页video
sws_scale的图像色彩空间转换

sws_scale的图像色彩空间转换

作者: 技术笔记 | 来源:发表于2019-12-17 14:15 被阅读0次

阅读ffmpegthumbnailer的代码,其中MovieDecoder::getScaledVideoFrame,将解码出来的avFrame送给filter,其中有rgb24这个format filter,经过这个转换,然后copy到VideoFrame的frameData中:

    videoFrame.frameData.resize(videoFrame.lineSize * videoFrame.height);
    memcpy((videoFrame.frameData.data()), res->data[0], videoFrame.frameData.size());

单从代码来看,这个地方直接拷贝的res->data[0]给videoFrame.frameData.data(),没有处理res->data[1],res->data[2],所以直观判断,这里已经是全部的数据了。

所以根据这一点,实现了下面的函数,通过sw_scale进行格式转换,不用再走过多的filter。还有一种思路,就是实现一个yuv到rgb的转换函数,把m_pFrame中的数据直接写到VideoFrame的frameData中,这个效率应该是最高的。

    videoFrame.width = m_pFrame->width;
    videoFrame.height = m_pFrame->height;

    int linesize[4];
    uint8_t* data[4];
    struct SwsContext *swsContext = NULL;
    swsContext = sws_getContext(m_pFrame->width, m_pFrame->height, AVPixelFormat(m_pFrame->format),
                             videoFrame.width, videoFrame.height, AV_PIX_FMT_RGB24,
                             SWS_BILINEAR, NULL, NULL, NULL);
    av_image_alloc(data, linesize, videoFrame.width, videoFrame.height, AV_PIX_FMT_RGB24, 1);
    sws_scale(swsContext, m_pFrame->data, m_pFrame->linesize, 0, m_pFrame->height, data, linesize);

    videoFrame.lineSize = linesize[0];
    videoFrame.frameData.resize(videoFrame.lineSize * videoFrame.height);
    memcpy(videoFrame.frameData.data(), data[0], videoFrame.frameData.size());

    sws_freeContext(swsContext);
    avpicture_free((AVPicture *)data);

代码分析:

  1. 首先获取SwsContext
  2. av_image_alloc根据width, height, pix_fmt初始化linesize[4], data[4]
  3. sws_scale色彩转换,完成yuv到rgb的转换
  4. 将data[0]的数据全部copy到framedata.data()

相关文章

  • sws_scale的图像色彩空间转换

    阅读ffmpegthumbnailer的代码,其中MovieDecoder::getScaledVideoFram...

  • 002 图像色彩空间转换

    RGB是设备无关的色彩空间,即在各种设备上都可以做到“所见即所得”。 安卓系统的raw data是YUV色彩空间的...

  • 009 图像色彩空间转换

    四种常见的色彩空间:RGB,HSV,YUV,YCrCb RGB是设备无关的、独立于设备的色彩空间; HSV对于直方...

  • OpenCV图像(二)

    图像色彩空间转换:cv2.cvtColor(input_image,flag)最经常用的是RGB转灰度、HSV 查...

  • OpenCV+Python图像读写

    写图像 色彩空间转换 在cv2中列出了所有支持的code,以“COLOR_”开头 读图像 样例 默认情况下,imr...

  • cvtColor(颜色空间转换)

    概念 用于将图像从一个颜色空间转换到另一个颜色空间的转换,比如将彩色图像转换为灰度图像等。 函数讲解 ●函数原型○...

  • 图像的色彩空间

    基础要点 这里主要讲了图像色彩空间的处理和色彩空间的基础知识 什么是色彩空间 人们建立了多种的色彩模型,以一维、二...

  • cvtColor 函数颜色空间(color space)说明

    色彩空间转换都用到以下约定:8位图像范围是0~255,16位图像范围是0~65536,浮点数的范围是0.0~1.0...

  • 色彩空间转换

    颜色空间的转换用到了如下约定: 8位图像的范围是[0,255] 16位图像的范围是[0,65535] 浮点数图像值...

  • 色彩空间类型转换

    RGB是一种比较常见的色彩空间类型,除此之外还有一些其他的色彩空间,比如常见的包括GRAY色彩空间(灰度图像)、X...

网友评论

    本文标题:sws_scale的图像色彩空间转换

    本文链接:https://www.haomeiwen.com/subject/oxmsnctx.html