首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 媒体动画 > 多媒体 >

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

2012-12-29 
用ffmpeg解码出视频帧,放在AVFrame里,如何画在屏幕上如题,请大家指点,谢谢。[解决办法]avpkt.data lpData

用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编程了解甚少,所以才问了该问题。

 SDL是可以跟mfc关联起来的,只用把SDL播放的窗口替换成MFC的窗体就行
[解决办法]
要显示出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的转化

热点排行