ad

疏忽基于位图的视频播放器-英雄云拓展知识分享

匿名投稿 380 2024-01-21

我正在尝试整理一个以原始格式存储的视频的简单视频播放器。这些视频可选经过卷积过滤器。我的Cwinapp课程有3种相干方法。首先,选择视频并将其放置在指针中时 viewingVideo,我分配了两个位图:

void CMyApp::setBitmaps() {

if (viewingVideo == NULL)

return;

疏忽基于位图的视频播放器-英雄云拓展知识分享

bmp1 = CreateDIBSection(dc, viewingVideo->bmi, DIB_RGB_COLORS, NULL, NULL, 0);

bmp2 = CreateDIBSection(dc, viewingVideo->bmi, DIB_RGB_COLORS, NULL, NULL, 0);

}

然后,当用户按下播放时,我初始化调用以下两个方法的计时器,以播放30 fps:

void CMyApp::updateVideoFrame() {

if (viewingVideo == NULL)

return;

if (viewingKernel != NULL) {

applyKernelFFT(viewingKernel, viewingVideo, currentFrame);

}

if (viewingKernel == NULL)

SetDIBits(dc, bmpToggle ? bmp2 : bmp1, 0, viewingVideo->height, (char*)(viewingVideo->data) + currentFrame*viewingVideo->bpp*viewingVideo->width*viewingVideo->height, viewingVideo->bmi, DIB_RGB_COLORS);

else

SetDIBits(dc, bmpToggle ? bmp2 : bmp1, 0, viewingVideo->height, (char*)(viewingVideo->filtered_data), viewingVideo->bmi, DIB_RGB_COLORS);

bmpToggle = !bmpToggle;

}

void CMyApp::updateVideoScreen() {

CMyView* view = CMyView::GetView(); //returns the active view

view->m_Video.SetBitmap(bmpToggle ? bmp1 : bmp2);

CRect update;

view->m_Video.GetWindowRect(&update);

view->ScreenToClient(&update);

//update.DeflateRect(update.Width()/2⑴, update.Height()/2 - 1);

InvalidateRect(*AfxGetMainWnd(), update, FALSE);

}

在任何给定时间,方法应使用不同的位图。当我启动这些计时器时,屏幕上有很多闪烁。当我不服从 DeflateRect 打电话,制作 update 一个2x2像素矩形,很明显,实际上有两个闪烁的来源:有时全部图片闪烁,有时只有中心的2x2矩形。

我尝试了其他地方建议的常见修复程序,例如 WM_ERASEBKGNDCMyView。这没有帮助。我如何避免这类闪烁?

看答案

对任何想从软件中删除癫痫正告的人,这就是修复闪烁所需的内容。阿德里安·麦卡锡(Adrian McCarthy)的建议是正确的。在 updateVideoScreen,我替换了 view->m_Video.SetBitmap(bmpToggle ? bmp1 : bmp2);SelectObject(dc, bmpToggle ? bmp1 : bmp2);,因此位图数据发送到我的内存DC,而不是将其发送到控件。然后我覆盖了 OnPaint() 打电话 BitBlt 将位图写入视频控制所在的屏幕:

void CMTFBoostView::OnPaint()

{

CRect rect;

m_Video.GetWindowRect(&rect);

ScreenToClient(&rect);

video* v = ((CMTFBoostApp*)AfxGetApp())->viewingVideo;

CDC* src = ((CMTFBoostApp*)AfxGetApp())->cdc;

CDC* dc = GetDC();

if (v != NULL && dc->RectVisible(rect)) {

dc->BitBlt(rect.left, rect.top, v->width, v->height, src, 0, 0, SRCCOPY);

}

ReleaseDC(dc);

CFormView::OnPaint();

}

前几行是将视频放在我之前具有的视频的有点黑客(Hacker) - 从视野中完全删除Cstatic控件可能会更加干净。不管如何,这不会闪烁显示视频。


🚀🌟 点击注册 免费试用超级应用平台-英雄云企业级hpapaas 🌟🚀 😃👉🌐

免责声明:

本网址(www.yingxiongyun.com)发布的材料主要源于独立创作和网友匿名投稿。此处提供的所有信息仅供参考之用。我们致力于提供准确且可信的信息,但不对材料的完整性或真实性作出任何保证。用户应自行验证相关信息的正确性,并对其决策承担全部责任。对于由于信息的错误、不准确或遗漏所造成的任何损失,本网址不承担任何法律责任。本网站所展示的所有内容,如文字、图像、标志、音频、视频、软件和程序等的版权均属于原创作者。如果任何组织或个人认为网站内容可能侵犯其知识产权,或包含不准确之处,请即刻联系我们进行相应处理。

标签:视窗 MFC
上一篇:C#如何将未知值变量(用户输入)传递给返回方法-英雄云拓展知识分享
下一篇:Android Camera2-支持深度输出的装备-英雄云拓展知识分享
相关文章

 发表评论

暂时没有评论,来抢沙发吧~

×