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

liahr 2010-06-30 09:57:47
如题,请大家指点,谢谢。
...全文
1936 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
波_爷 2012-03-14
  • 打赏
  • 举报
回复
不知道你还在不在这里哦,关于这部分,我也向了解一下,就是视频解码出来后,显示那块,能不能用其他的东西做,就是显示部分自己做。
CyberLogix 2010-07-23
  • 打赏
  • 举报
回复
使用DDraw直接可以显示YUV数据,不需要进行YUV-RGB的转化
HersonX 2010-07-23
  • 打赏
  • 举报
回复
DDraw绘制,网上找一大堆。否则使用DirectShow写个RenderFilter,比较难。
周江涛 2010-07-21
  • 打赏
  • 举报
回复
不要以为你把30帧位图用双核的CPU播放出来了,就认为你的VGA驱动和你的播放牛B了
周江涛 2010-07-21
  • 打赏
  • 举报
回复
你试下1080P,30帧,GDI方式,再看看CPU占用,就知道有多恶心了,windows下快速显示还是得DX

[Quote=引用 14 楼 sxcong 的回复:]
一般,decode之后是YUV420,然后转成RGB24

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

顺便一提,GDI画图的速度还是很快的,每秒30帧VGA太轻松了。不知道所谓“慢的像蜗牛”的说法那位,你做过G……
[/Quote]
coloriy 2010-07-16
  • 打赏
  • 举报
回复
楼上的似乎所得比较正确,那live555收rtsp数据部分有没有人给点建议,还有ffmpeg解码后事YUV420吗
sxcong 2010-07-16
  • 打赏
  • 举报
回复
一般,decode之后是YUV420,然后转成RGB24

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

顺便一提,GDI画图的速度还是很快的,每秒30帧VGA太轻松了。不知道所谓“慢的像蜗牛”的说法那位,你做过GDI画图没有?你电脑VGA的速度是多少帧?假设电脑是P3 800,内存256M,也就是10年的大众配置。
coloriy 2010-07-16
  • 打赏
  • 举报
回复
解析的数据应该采用什么方式画在屏幕上,我说的是windows端?有没有人知道好方法,我以为也是直接画,楼上说会很慢??
周江涛 2010-07-07
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 liahr 的回复:]
我不想使用SDL。
[/Quote]
老兄你不会想使用GDI/GDI+画在窗口上吧?那样会慢的像蜗牛
liahr 2010-07-03
  • 打赏
  • 举报
回复
我不想使用SDL。
liahr 2010-07-02
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 warsour 的回复:]
引用 5 楼 liahr 的回复:
引用 3 楼 warsour 的回复:
ffmpeg源码里有个ffplay.c,是个简单的播放器,用的是sdl来播放你解出的数据,可以参考参考~

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

SDL是可以跟mfc关联起来的,只用把SDL播放的窗口替换成MFC的窗体就行
[/Quote]
简单的说吧,使用哪个函数,把它画在屏幕上?
周江涛 2010-07-02
  • 打赏
  • 举报
回复
要显示出video,一个函数可不够.
SDL_SetVideoMode 这个可以打开SDL窗口
SDL_CreateYUVOverlay 这个创建YUV表面.也可以使用SDL_CreateRGBSurface来创建RGB表面
填充数据...
最后用SDL_DisplayYUVOverlay 这个把数据画到窗口上
warsour 2010-07-01
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 liahr 的回复:]
引用 3 楼 warsour 的回复:
ffmpeg源码里有个ffplay.c,是个简单的播放器,用的是sdl来播放你解出的数据,可以参考参考~

谢谢您的回复。
我是想在MFC的框架下播放一个视频,由于对windows编程了解甚少,所以才问了该问题。
[/Quote]
SDL是可以跟mfc关联起来的,只用把SDL播放的窗口替换成MFC的窗体就行
max123456 2010-07-01
  • 打赏
  • 举报
回复
我的那段代码执行完后:lpOut 中就是你所要的数据,可以向他写入文件,也可能显示出来的,数据的类型根据参数PIX_FMT_YUYV422决定,如果你想要32位可以改为PIX_FMT_RGB32等等。
而且调用的函数全部是ffmpeg中的
warsour 2010-06-30
  • 打赏
  • 举报
回复
ffmpeg源码里有个ffplay.c,是个简单的播放器,用的是sdl来播放你解出的数据,可以参考参考~
liahr 2010-06-30
  • 打赏
  • 举报
回复
看不太明白。
加入说我现在使用MFC写了一个简单的程序,然后继承ffmpeg,解码后,得到了一个填充好的AVPacket结构:已经解码的数据,我把怎么样把这些数据绘制到屏幕上,来达到播放的目的呢?
max123456 2010-06-30
  • 打赏
  • 举报
回复
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;
}


liahr 2010-06-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 warsour 的回复:]
ffmpeg源码里有个ffplay.c,是个简单的播放器,用的是sdl来播放你解出的数据,可以参考参考~
[/Quote]
谢谢您的回复。
我是想在MFC的框架下播放一个视频,由于对windows编程了解甚少,所以才问了该问题。
jeremy_wong 2010-06-30
  • 打赏
  • 举报
回复
还有ffdshow,你都可以参考。

2,542

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧