首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FFMpeg RGB32 to NV12使用SWScale

FFMpeg RGB32 to NV12使用SWScale
EN

Stack Overflow用户
提问于 2016-03-16 14:32:04
回答 1查看 1.3K关注 0票数 2

我正在尝试将RGB32帧转换为NV12帧,以输入编码器。

代码语言:javascript
复制
m_iWidthIn = 1920;
m_iHeightIn = 1080;
m_iWidthOut = (((iWidthIn  + 31) >> 5) << 5) //32bit align
m_heightOut = (((iHeightIn + 31) >> 5) << 5) //32bit align
m_outputPixelFormat = AV_PIX_FMT_NV12;

// allocate and fill buffers

m_sws = ::sws_getContext(m_iWidthIn, m_iHeightIn, AV_PIX_FMT_RGB32, m_iWidthOut, m_iHeightOut, m_outputPixelFormat, SWS_FAST_BILINEAR, nullptr, nullptr, nullptr);
AVFrame* frameOut = av_frame_alloc();
frameOut->height = m_iHeightOut;
frameOut->width = m_iWidthOut;
frameOut->format = m_outputPixelFormat;
av_frame_get_buffer(frameOut, 32);
int linesize[1] = { m_iWidthIn * 4 };
uint8_t * data[1] = { m_inputBuffer  };
if (m_bFlip)
{
    data[0] += linesize[0] * (m_iHeightIn - 1);
    linesize[0] = -linesize[0];
}
::sws_scale(m_sws, data, linesize, 0, m_iHeightIn, frameOut->data, frameOut->linesize);
::av_image_copy_to_buffer(pOutputBuffer, lDataLen, frameOut->data, frameOut->linesize, m_outputPixelFormat, m_iWidthOut, m_iHeightOut, 32);

如果我制作m_outputPixelFormat AV_PIX_FMT_RGB32并使用DMO颜色空间转换器,视频就会正确出来。但是,如果我将其更改为NV12,最终会得到一个倾斜的视频,底部有丢失的数据。我知道这是由于我错误地从缓冲区中复制数据造成的,但我不确定我在做什么不正确。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-28 11:49:12

你的问题是:

代码语言:javascript
复制
m_heightOut = (((iHeightIn + 31) >> 5) << 5) //32bit align

你不需要调整高度。所以frameOut->datam_iHeightIn的高度。正确的一行是:

代码语言:javascript
复制
m_heightOut = iHeightIn;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36038675

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档