社区
多媒体/流媒体开发
帖子详情
用ffmpeg解码出视频帧,放在AVFrame里,如何画在屏幕上
liahr
2010-06-30 09:57:47
如题,请大家指点,谢谢。
...全文
2002
20
打赏
收藏
用ffmpeg解码出视频帧,放在AVFrame里,如何画在屏幕上
如题,请大家指点,谢谢。
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用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,你都可以参考。
深度剖析
FFmpeg
视频
解码
后的
帧
处理到Qt显示 从
AV
Frame
到QImage的转换
深度剖析
FFmpeg
视频
解码
后的
帧
处理到Qt显示 从
AV
Frame
到QImage的转换
【
FFmpeg
】
FFmpeg
播放器框架 ② ( 解复用 - 读取媒体流 | 将压缩数据
AV
Packet
解码
为
AV
Frame
音频
帧
和
视频
帧
| 播放
AV
Frame
数据 )
一、" 解封装 -
解码
- 播放 过程 " 涉及到的函数和结构体概述 1、打开媒体文件 3、解复用 - 读取媒体流 4、音
视频
解码
- 将压缩数据
AV
Packet
解码
为
AV
Frame
音频
帧
和
视频
帧
5、音
视频
播放 - 播放
AV
Frame
数据
FFmpeg
判断
视频
帧
类型
本文介绍了两种使用
FFmpeg
判断
视频
帧
类型的方法:1)通过
解码
AV
Frame
获取精确
帧
类型(I/P/B
帧
),该方法准确但性能较低;2)通过检查
AV
Packet标志快速识别关键
帧
(I
帧
),效率高但无法区分P/B
帧
。文章提供了详细的C++实现代码,并比较了两种方法的特性,建议根据实际需求选择:精确分析使用第一种方法,快速定位关键
帧
使用第二种方法。两种方法可单独或结合使用,以达到最佳效果。
FFmpeg
:
AV
Frame
结构体分析
最近发现了
ffmpeg
有个网页版的文档,分享给大家:
ffmpeg
文档,查询起来看是挺方便的。现在才发现,是不是有点太晚了? 之前都是直接看源码上的注释,反过来想想,那些注释写的也都听清晰易懂的哈(自我安慰)。
AV
Frame
AV
Frame
结构体描述了
解码
后的(原始)音频或
视频
数据。
AV
Frame
通常被分配一次,然后多次重复使用以持有不同的数据(例如,单个
AV
Frame
持有从
解码
器接收的
帧
)。 ...
音
视频
从入门到精通——
FFmpeg
结构体:
AV
Frame
分析-my write
RGB,对音频来说是PCM),此外还包含了一些相关的信息。比如说,
解码
的时候存储了宏块类型表,QP表,运动矢量表等数据。因此在使用
FFMPEG
进行码流分析的时候,
AV
Frame
是一个很重要的结构体。将图像绘制到界面上,注意
AV
Frame
的一行像素和windowBuffer一行像素长度可能不一致,需要转换好,否则可能花屏。
AV
Packet:存储压缩数据(
视频
对应H.264等码流数据,音频对应AAC/MP3等码流数据)
AV
Frame
:存储非压缩的数据(
视频
对应RGB/YUV像素数据,音频对应PCM采样数据)
多媒体/流媒体开发
2,554
社区成员
20,277
社区内容
发帖
与我相关
我的任务
多媒体/流媒体开发
专题开发/技术/项目 多媒体/流媒体开发
复制链接
扫一扫
分享
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章