返回信息流从网络传来的大量位图,接受后在MFC上显示,最后看起来就是视频的样子
现在程序瓶颈就卡在这了,用GDI 直接 blit ,CPU占用高
网上有说用视频函数 DrawDibRealize() 和 DrawDibDraw() 会好些,但是我照抄的代码连续显示6、7个位图就异常了,诡异
用什么建议吗?
这是一条镜像帖。来源:北邮人论坛 / cpp / #40697同步于 2010/6/23
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
[求助] VC 里如何快速显示位图
ATV
2010/6/23镜像同步4 回复
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
真巧,前几天刚刚自己写了个简单的YUV视频播放器,效果还不错,给你贴个自己胡搞的代码吧
int InitBmpInfo()
{
bmpinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmpinfo.bmiHeader.biBitCount = 24;
bmpinfo.bmiHeader.biClrImportant = 0;
bmpinfo.bmiHeader.biClrUsed = 0;
bmpinfo.bmiHeader.biCompression = 0;
bmpinfo.bmiHeader.biHeight = - imginfo.height;
bmpinfo.bmiHeader.biWidth = imginfo.width;
bmpinfo.bmiHeader.biPlanes = 1;
bmpinfo.bmiHeader.biSizeImage = imginfo.width * imginfo.height * 3;
bmpinfo.bmiHeader.biXPelsPerMeter = 12;
bmpinfo.bmiHeader.biYPelsPerMeter = 12;
return 1;
}
DWORD WINAPI DecoderThreadProc (LPVOID pParam)
{
Sleep(10);
HWND hWnd = (HWND)pParam;
HDC hDc = GetDC(hWnd);
int frame = imginfo.framestart;
int interval = 1000 / imginfo.framerate;
if (!imginfo.infile)
return 0;
ifstream yuvfile(imginfo.infile, ios::in | ios::binary);
if (!yuvfile.is_open())
return 0;
while (1) {
if (frame > imginfo.frameend) {
if (playerctrl.loop)
frame = imginfo.framestart;
else
break;
}
ReadFrame(yuvfile, frame);
StretchDIBits(hDc, 0, 0, imginfo.width, imginfo.height, 0, 0, imginfo.width, imginfo.height, playerctrl.canvas, &bmpinfo, DIB_RGB_COLORS, SRCCOPY);
frame++;
Sleep(interval);
}
yuvfile.close();
ReleaseDC(hWnd, hDc);
return 1;
}
时间精确度自然不是很准确 更准确点 可以用多媒体定时器之类的 不过嘛 sleep已经凑凑有余了, 这个比SetTimer定时器好多了 因为定时器消息的优先级很低
还有 最好独立开辟一个线程进行视频显示 还有 你涉及到网络传输 所以缓冲要考虑好
谢谢,明天试试,对比一下~
【 在 jmpesp 的大作中提到: 】
: 真巧,前几天刚刚自己写了个简单的YUV视频播放器,效果还不错,给你贴个自己胡搞的代码吧
: [color=#0000FF]int InitBmpInfo()
: {
: ...................