【问题标题】:FFMpeg RGB32 to NV12 using SWScale使用 SWScale 的 FFMpeg RGB32 到 NV12
【发布时间】:2016-04-28 19:49:12
【问题描述】:

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

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,我最终会得到一个倾斜的视频,底部缺少数据。 我知道这是由于我错误地将数据从缓冲区中复制出来造成的,但我不确定我做错了什么。

【问题讨论】:

  • 您的frameOut-&gt;data 应该有两个指向 NV12、Y 和 UV 数据的指针。同样,linesize。我没有看到你在上面的代码 sn-p 中得到了这些准备。
  • av_image_copy_to_buffer 是一个 avutil 函数。我认为它应该使用受支持的格式。
  • 你需要在sws_scale调用中提供飞机,当你提到的av_image_copy_to_buffer只会在之后发生。

标签: c++ ffmpeg directshow swscale


【解决方案1】:

你的问题在这里:

m_heightOut = (((iHeightIn + 31) >> 5) << 5) //32bit align

您不需要对齐高度。所以frameOut-&gt;datam_iHeightIn 高度。 正确的行是:

m_heightOut = iHeightIn;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-28
    • 1970-01-01
    • 2021-11-25
    • 2011-11-06
    • 2018-02-28
    • 2019-01-18
    • 1970-01-01
    相关资源
    最近更新 更多