mfc+ffmpeg做播放器,窗口大小改变时出现的奇异现象 本帖最后由 zxwangyun 于 2012-02-28 10:12:42 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我VS2005打不开你工程,看代码是GDI写屏的,这个效果估计不行吧 应该不是缓冲区的问题,这个问题只是出现在播放窗口大小改变的时候,也就是当窗口大小改变的时候会出现。如果窗口大小合适,就没有问题。格式这个都不影响吧?反正都是解码成rgb数据。 VS2008的工程,用GDI输出的。应该也不是刷新的问题,如果是刷新问题的话,至少有些图片是正常的。 我现在的方法是通过显示窗口句柄,创建内存dc,通过CreateDIBSection函数创建DIB,然后选入内存DC,再通过ffmpeg将视频帧解码为RGB数据到DIB的数据区域,通过BitBlt将内存dc显示,有什么问题么?DIB和内存指针都是通过判断显示窗口大小有没有改变动态创建的。 哎,终于搞定,太不容易了。在创建位图的时候位图宽度必须是4的整数倍。否则就出现这样的情况。感谢Worcy_kiddy(黑泡泡选手)的回复。 谢谢楼主的无私奉献,经过调试,已经成功,只修订了一行代码即可:修改前:int CAVPlayer::ScaleFrame(void * pframe){ //省略... int linesize[4] = {m_iWidth*3, 0, 0, 0}; //省略..}修改后:---成功int CAVPlayer::ScaleFrame(void * pframe){ //省略... int linesize[4] = {(m_iWidth*3+3) &~3, 0, 0, 0}; //省略..} 楼主的视频源是rtsp协议的视频流吗?? 这个只能播放RTSP的?可以播放本地本件么? 在ATL/WTL工程里增加了一句 #include "afxinet.h" 就出现了这个错误提示 !!!!!!!请诸位帮忙看一下,这关于COM OLE的内存泄露到底在什么地方 请高手给个建议! 超级菜鸟问题:初学者该看点什么书呢? ★★★★★★★为什么注册表中明明有三项,却只能读出两项★★★★★★★ 有什么比较全适的项目可以参加比赛? 网络编程高手请留个QQ号。 请各位帮帮忙,给我一个 求表达式 的例子 CTreeCtrl::SetImageList与节点关联//MFC底层怎么实现的? 窗口切分 VC2010 写字符串到txt文本问题? cocos2d-x 中怎么捕获KeyUp消息
在创建位图的时候位图宽度必须是4的整数倍。否则就出现这样的情况。
感谢Worcy_kiddy
(黑泡泡选手)
的回复。
修改前:
int CAVPlayer::ScaleFrame(void * pframe)
{
//省略...
int linesize[4] = {m_iWidth*3, 0, 0, 0};
//省略..
}
修改后:---成功
int CAVPlayer::ScaleFrame(void * pframe)
{
//省略...
int linesize[4] = {(m_iWidth*3+3) &~3, 0, 0, 0};
//省略..
}
可以播放本地本件么?