Я использую функции ffmpeg для декодирования кадров h264 и отображения в окне на платформе Windows. Подход, который я использую, как показано ниже (от FFMPEG Frame to DirectX Surface):FFMPEG Frame to DirectX Surface Hardware Accelerated
AVFrame *frame;
avcodec_decode_video(_ffcontext, frame, etc...);
lockYourSurface();
uint8_t *buf = getPointerToYourSurfacePixels();
// Create an AVPicture structure which contains a pointer to the RGB surface.
AVPicture pict;
memset(&pict, 0, sizeof(pict));
avpicture_fill(&pict, buf, PIX_FMT_RGB32,
_ffcontext->width, _ffcontext->height);
// Convert the image into RGB and copy to the surface.
img_convert(&pict, PIX_FMT_RGB32, (AVPicture *)frame,
_context->pix_fmt, _context->width, _context->height);
unlockYourSurface();
В коде я использую sws_scale вместо img_convert.
Когда я передаю указатель поверхностных данных в sws_scale (на самом деле в avpicture_fill), кажется, что указатель данных фактически находится в ОЗУ не в памяти графического процессора, и когда я хочу отобразить поверхность, кажется, что данные переместился на GPU и затем отобразился. Поскольку я знаю, что загрузка процессора высока, когда данные копируются между ОЗУ и памятью GPU.
Как я могу настроить ffmpeg для рендеринга непосредственно на поверхность на GPU-памяти (а не на указателе данных в ОЗУ)?
Если указатель данных находится в ОЗУ, это происходит не из-за функции getPointerToYourSurfacePixels(), то есть ffmpeg ничего не может изменить об этом? – stijn