当前位置: 代码迷 >> 多媒体/流媒体开发 >> 用ffmpeg解码出视频帧,放在AVFrame里,怎么画在屏幕上
  详细解决方案

用ffmpeg解码出视频帧,放在AVFrame里,怎么画在屏幕上

热度:9335   发布时间:2013-02-26 00:00:00.0
用ffmpeg解码出视频帧,放在AVFrame里,如何画在屏幕上
如题,请大家指点,谢谢。

------解决方案--------------------------------------------------------
avpkt.data = lpData;
avpkt.size = iInLength;
iOutLength = 0;

while(avpkt.size > 0)
{
nlen = avcodec_decode_video2(m_CodecCtx, m_picture, &ngot_picture, &avpkt);

if (0 > nlen)

return;
}

if(ngot_picture)
{
avpicture_fill((AVPicture *)m_pFrameYUV, lpOut, PIX_FMT_YUYV422, m_CodecCtx->width, m_CodecCtx->height);

static struct SwsContext *img_convert_ctx = NULL;
if (!img_convert_ctx)
{
img_convert_ctx = sws_getContext(m_CodecCtx->width, m_CodecCtx->height,
m_CodecCtx->pix_fmt,
m_CodecCtx->width, m_CodecCtx->height,
PIX_FMT_YUYV422,
SWS_BICUBIC, NULL, NULL, NULL);
}

sws_scale(img_convert_ctx, m_picture->data, m_picture->linesize,
0, m_CodecCtx->height, m_pFrameYUV->data, m_pFrameYUV->linesize); 

//SaveAsBMP(m_pFrameYUV, m_CodecCtx->width, m_CodecCtx->height, 0, 24);
iOutLength = m_CodecCtx->width * m_CodecCtx->height * 3;
}

avpkt.data += nlen;
avpkt.size -= nlen;

 
 

------解决方案--------------------------------------------------------
ffmpeg源码里有个ffplay.c,是个简单的播放器,用的是sdl来播放你解出的数据,可以参考参考~
------解决方案--------------------------------------------------------
探讨
引用:
ffmpeg源码里有个ffplay.c,是个简单的播放器,用的是sdl来播放你解出的数据,可以参考参考~

谢谢您的回复。
我是想在MFC的框架下播放一个视频,由于对windows编程了解甚少,所以才问了该问题。

------解决方案--------------------------------------------------------
要显示出video,一个函数可不够.
SDL_SetVideoMode 这个可以打开SDL窗口
SDL_CreateYUVOverlay 这个创建YUV表面.也可以使用SDL_CreateRGBSurface来创建RGB表面
填充数据...
最后用SDL_DisplayYUVOverlay 这个把数据画到窗口上
------解决方案--------------------------------------------------------
一般,decode之后是YUV420,然后转成RGB24

显示就简单多了:
先填充BITMAPINFO结构体,宽高像素都知道,这一点很容易。
然后StretchDIBits
可能有时候发现图是倒立的,改高度为负数,或者解 yuv的时候,带个参数,把图像上下颠倒一下就行了。

顺便一提,GDI画图的速度还是很快的,每秒30帧VGA太轻松了。不知道所谓“慢的像蜗牛”的说法那位,你做过GDI画图没有?你电脑VGA的速度是多少帧?假设电脑是P3 800,内存256M,也就是10年的大众配置。
------解决方案--------------------------------------------------------
使用DDraw直接可以显示YUV数据,不需要进行YUV-RGB的转化
  相关解决方案