2016-03-16 14 views
1

Я пытаюсь преобразовать кадры RGB32 в кадры NV12 для подачи в кодировщик.FFMpeg RGB32 to NV12 с использованием SWScale

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, я получаю наклонное видео с отсутствующими данными внизу. Я знаю, что это вызвано тем, что я неправильно копировал данные из буфера, но я не уверен, что я делаю неправильно.

+0

Ваш 'frameOut-> data' должны иметь два указателя для NV12, для Y и для УФ-данных. Аналогично, 'lineize'. Я не вижу, чтобы вы получали эти препараты в фрагменте кода выше. –

+0

'av_image_copy_to_buffer' - это функция avutil. Я думаю, он должен работать с поддерживаемым форматом. – KevinA

+0

Вам необходимо предоставить самолеты в вызове 'sws_scale', когда тот, который вы упомянули, будет' av_image_copy_to_buffer' только после этого. –

ответ

1

Ваша проблема здесь:

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

Вам не нужно, чтобы выровнять высоту. Таким образом, frameOut->data имеет m_iHeightIn высота. Правильная линия:

m_heightOut = iHeightIn; 

 Смежные вопросы

  • Нет связанных вопросов^_^