急求救win32下directshow刷新问题

ayiyi0910 2011-07-25 10:44:03
急求救一个win32下directshow刷新问题

我用win32写了一个dll, 然后在用CreateWindow建立了一个主窗体和一个static控件, 把static控件传给了IID_IVideoWindow用来浏缆视频, 但视频浏缆一直刷不出来

BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
m_hInst = (HINSTANCE)hModule;

m_bCallState = FALSE;
m_bSpeech = FALSE;
m_bVideoState = FALSE;

GetDirectory();

return TRUE;
}

ATOM MyRegisterClass(HINSTANCE hInstance)
{
// 定义窗口类
WNDCLASS wndcls;
wndcls.cbClsExtra = 0;
wndcls.cbWndExtra = 0;

HBITMAP hbmp = GetBitmap(PNG_BK);
wndcls.hbrBackground = CreatePatternBrush(hbmp);
// wndcls.hbrBackground = 0;

// wndcls.hCursor=LoadCursor(NULL,IDC_ARROW);
// wndcls.hIcon=LoadIcon(NULL,IDI_WINLOGO);

wndcls.hCursor = NULL;
wndcls.hIcon = NULL;

wndcls.hInstance = m_hInst;
wndcls.lpfnWndProc = WindowProc;

wndcls.lpszClassName = L"DLL";
wndcls.lpszMenuName = NULL;
wndcls.style = CS_HREDRAW | CS_VREDRAW;

// 注册初始化的窗口类
return RegisterClass(&wndcls);
}

LRESULT WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;

wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);

switch (uMsg)
{
case WM_CLOSE:
DestroyWindow(hWnd);
return FALSE;
break;
case WM_DESTROY:
PostQuitMessage(0);
return FALSE;
case WM_PAINT:
{
if (hWnd == m_hWndDLG)
{
OnPaint(hWnd, m_hBitmapBK);

return TRUE;
}
}
break;
case WM_COMMAND:
{
switch (wmId)
{
case IDC_BUTTON_LINK:
{
OnButtonCall();
}
break;
case IDC_BUTTON_VIDEO:
{
OnButtonVedio();
}
break;
case IDC_BUTTON_BACK:
{
OnButtonBack();
}
break;
case IDC_BUTTON_SPEECH:
{
OnButtonSpeech();
}
break;
default:
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

// return TRUE;
}
break;

case WM_NOTIFY:
{
if(NM_CLICK == ((LPNMHDR)lParam)->code)
{
OnClickTree(hWnd);

// return TRUE;
}
}
break;
case WM_ACTIVATE:
{
if (hWnd == m_hWndDLG)
{
// 隐藏命令栏
HWND hWnd = SHFindMenuBar(m_hWndDLG);
::CommandBar_Show(hWnd, FALSE);

//如果对话框不在最前面,那么SHFullScreen()函数会失败
SetForegroundWindow(m_hWndDLG);

// 隐藏任务栏,任务栏是屏幕最上边的一条
SHFullScreen(m_hWndDLG, SHFS_HIDETASKBAR | SHFS_HIDESIPBUTTON | SHFS_HIDESTARTICON);
return TRUE;
}
}
break;
default:
return DefWindowProc(hWnd, uMsg, wParam, lParam);
};

return DefWindowProc(hWnd, uMsg, wParam, lParam);

// return FALSE; // 返回FALSE给缺省对话框函数DefDlgProc(),表示没有处理本消息
}


// 建立主窗体
BOOL CreatVCIPWnd()
{
BOOL bRet = FALSE;

// 垂直显示
DEVMODE devmode = {0};
devmode.dmSize = sizeof(DEVMODE);
devmode.dmDisplayOrientation = DMDO_0; //垂直模式
devmode.dmFields = DM_DISPLAYORIENTATION;
ChangeDisplaySettingsEx(NULL, &devmode, NULL, 0, NULL);

int nWidth = GetSystemMetrics(SM_CXSCREEN);
int nHeight = GetSystemMetrics(SM_CYSCREEN);

MyRegisterClass(m_hInst);
if (!m_hInst)
{
return FALSE;
}

// 获取背景图
m_hBitmapBK = GetBitmap(PNG_BK);

m_hWndDLG = CreateWindow(L"DLL", NULL, WS_BORDER,
0, 0, nWidth, nHeight, NULL, NULL, m_hInst, (DLGPROC)WindowProc);
if (!m_hWndDLG)
{
return FALSE;
}
MoveWindow(m_hWndDLG, 0, 0, nWidth, nHeight, TRUE);
ShowWindow(m_hWndDLG, SW_SHOW);

// 隐藏命令栏
HWND hWnd = SHFindMenuBar(m_hWndDLG);
::CommandBar_Show(hWnd, FALSE);

//如果对话框不在最前面,那么SHFullScreen()函数会失败
SetForegroundWindow(m_hWndDLG);

// 隐藏任务栏,任务栏是屏幕最上边的一条
SHFullScreen(m_hWndDLG, SHFS_HIDETASKBAR | SHFS_HIDESIPBUTTON | SHFS_HIDESTARTICON);

SetControl(nWidth, nHeight);

UpdateWindow(m_hWndDLG);

return TRUE ;
}

// 建立浏览窗体
void NewVideoScreen(RECT rect)
{
BOOL bRet = FALSE;

if ( NULL == m_hWVideoScreen)
{
int nWidth = rect.right - rect.left;
int nHeight = rect.bottom - rect.top;

m_hWVideoScreen = CreateWindow(TEXT("STATIC"), NULL ,WS_CHILD | WS_VISIBLE | SS_CENTERIMAGE | SS_BITMAP | SS_NOTIFY,
rect.left, rect.top, nWidth, nHeight, m_hWndDLG, (HMENU)IDC_STATIC_VIDEO, m_hInst, 0);

if (NULL == m_hWVideoScreen)
{
return;
}
}

ShowWindow(m_hWVideoScreen, SW_SHOW);
}

BOOL CEricCamera::PreviewCamera(HWND hVideoWnd)
{
HRESULT hResult = S_FALSE;

// 摄像头设备名称
WCHAR wzDeviceName[MAX_PATH + 1];

// 定义摄像头设备名称
// VARIANT varCamName;
CComVariant varCamName;

//摄像头属性页
CPropertyBag PropBag;

// 视频窗口尺寸
RECT rectVideo;

//--定义录像用到的编码、写文件等FILTER
IBaseFilter *pVideoEncoder = NULL;
IBaseFilter *pASFMultiplexer = NULL;

//默认先释放DSHOW接口
FreeDShow();

// 创建ICaptureGraphBuilder2接口,用于管理媒体捕捉对象
CHK(CoCreateInstance(CLSID_CaptureGraphBuilder, NULL,CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, (void **)&m_pCaptureGraphBuilder));

// 创建IGraphBuilder接口
CHK(CoCreateInstance(CLSID_FilterGraph, NULL,CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&m_pGraphBuilder));

// 设置FilgerGraph接口
CHK(m_pCaptureGraphBuilder->SetFiltergraph(m_pGraphBuilder));

// 得到IMediaControl接口,用于控制流播放
CHK(m_pGraphBuilder->QueryInterface(&m_pMediaControl));

// 得到IMediaSeeking接口,用于设置播放位置
CHK(m_pGraphBuilder->QueryInterface(&m_pMediaSeeking));


// 得到m_pMediaEvent接口,用于获取媒体事件
CHK(m_pGraphBuilder->QueryInterface(&m_pMediaEvent));


// 创建视频捕捉Filter
CHK(CoCreateInstance(CLSID_VideoCapture, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void **)&m_pVideoCaptureFilter));


// 得到视频捕捉属性页接口
CHK(m_pVideoCaptureFilter->QueryInterface(&m_pPropertyBag));


// 选择视频捕捉设备
// 得到第1个视频捕捉设备名。
if (!GetFirstCameraDriver(wzDeviceName))
{
goto Cleanup;
}

varCamName = wzDeviceName;
if(( varCamName.vt == VT_BSTR ) == NULL ) {
return FALSE;
}

//设置视频捕捉为第1个捕捉设备
PropBag.Write( L"VCapName", &varCamName );
CHK(m_pPropertyBag->Load( &PropBag, NULL ));

// 将视频捕捉FILTER添加到FILTER图中。
CHK(m_pGraphBuilder->AddFilter( m_pVideoCaptureFilter, L"Video capture source" ));

// 设置视频预览窗口
// CHK(m_pGraphBuilder->QueryInterface(&m_pVideoWindow));
CHK(m_pGraphBuilder->QueryInterface(IID_IVideoWindow,(void**)&m_pVideoWindow));


// 设置视频播放的WINDOWS窗口
m_pVideoWindow->put_Owner((OAHWND)hVideoWnd);
m_pVideoWindow->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);

//设置视频尺寸
GetClientRect(hVideoWnd, &rectVideo);
int nWidth = rectVideo.right - rectVideo.left;
int nHeight = rectVideo.bottom - rectVideo.top;
m_pVideoWindow->SetWindowPosition(rectVideo.left, rectVideo.top, nWidth, nHeight);
m_pVideoWindow->put_Visible(OATRUE);


// 渲染捕捉PIN, 用于录像
CHK(m_pCaptureGraphBuilder->RenderStream( &PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video,
m_pVideoCaptureFilter, pVideoEncoder, pASFMultiplexer ));

// 预览视频
CHK(m_pMediaControl->Run());

Cleanup:
// 释放接口
if (pVideoEncoder != NULL)
{
pVideoEncoder->Release();
pVideoEncoder = NULL;
}

if (pASFMultiplexer != NULL)
{
pASFMultiplexer->Release();
pASFMultiplexer = NULL;
}

// if (pFileSinkFilter != NULL)
// {
// pFileSinkFilter.Release();
// pFileSinkFilter = NULL;
// }
//
// if (pWrapperFilter != NULL)
// {
// pWrapperFilter.Release();
// pWrapperFilter = NULL;
// }

if( FAILED( hResult ))
{
return FALSE;
}
else
{
return TRUE;
}
}

最后用下面的代码启动浏览

if( NULL == m_hWVideoScreen)
{
RECT rect;

rect.left = VIDEO_SRCCEN_LEFT;
rect.top = VIDEO_SRCCEN_TOP;
rect.right = VIDEO_SRCCEN_LEFT + VIDEO_SRCCEN_WIDTH;
rect.bottom = VIDEO_SRCCEN_TOP + VIDEO_SRCCEN_HEIGHT;

NewVideoScreen(rect);
}


if (m_hWVideoScreen)
{
ShowWindow(m_hWVideoScreen, SW_SHOW);

if ( NULL == m_Camera)
{
m_Camera = new CEricCamera();
}

m_Camera->PreviewCamera(m_hWVideoScreen);
m_bVideoRun = TRUE;
}
但是图象一直刷不出来

我在mfc上直接加了一个static控件, 一样的调用PreviewCamera把它传给CEricCamera是可以显示出视频的, 急求教一下我要怎么样才能在win32上刷新显示出来
...全文
169 8 打赏 收藏 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ayiyi0910 2011-07-27
  • 打赏
  • 举报
回复
奇怪了, 直接用就可以刷新, 想不清楚为什么
南安风语者 2011-07-27
  • 打赏
  • 举报
回复
你不要用类, 直接调用directshow看看
ayiyi0910 2011-07-26
  • 打赏
  • 举报
回复
m_hWVideoScreen是被显示出来的, 唉, 要怎么才能让它把图片刷新上去呀
beyondma 2011-07-26
  • 打赏
  • 举报
回复
在ShowWindow(m_hWVideoScreen, SW_SHOW|SW_MAXIMIZE);试试,另外把他去了m_Camera->PreviewCamera(m_hWVideoScreen);
把看看你的m_hWVideoScreen是不是被显示出来了。
ayiyi0910 2011-07-26
  • 打赏
  • 举报
回复
急求答案, 顶一下
celisha 2011-07-26
  • 打赏
  • 举报
回复
有点困难。。。
ayiyi0910 2011-07-25
  • 打赏
  • 举报
回复
可以的跑到这里的
beyondma 2011-07-25
  • 打赏
  • 举报
回复
// 渲染捕捉PIN, 用于录像
CHK(m_pCaptureGraphBuilder->RenderStream( &PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video,
m_pVideoCaptureFilter, pVideoEncoder, pASFMultiplexer ));

// 预览视频
CHK(m_pMediaControl->Run());
能一直跑到这吗?
内容概要:本文围绕【复现IEEE二区文献】基于状态空间表示与组件连接法的构网型逆变器统一小信号建模框架研究,提出了一种适用于多控制策略构网型逆变器的小信号建模方法。该方法结合状态空间建模理论与组件连接法(Component Connection Method),实现了对复杂逆变器系统动态特性的精确描述,尤其适用于分析系统在不同运行工况下的稳定性。通过Matlab代码实现,构建了包含控制环路、滤波器、锁相环等关键模块的完整小信号模型,并利用特征值分析与模态参与度评估系统稳定性,解决了传统建模方法在面对多时间尺度、强耦合非线性控制结构时建模困难、精度不足的问题。研究还探讨了关键控制参数对系统稳定边界的影响,为构网型逆变器的参数整定与优化设计提供了理论依据和技术支撑。; 适合人群:具备电力电子、自动控制理论基础,从事新能源发电、微电网、电力系统稳定性研究的研究生、科研人员及工程技术人员,尤其适合致力于高水平期刊论文复现与仿真实践的科研工作者。; 使用场景及目标:① 掌握构网型逆变器统一小信号建模的核心方法,复现IEEE二区高水平文献成果;② 理解状态空间法与组件连接法在复杂电力电子系统建模中的集成应用;③ 利用Matlab进行特征值分析与稳定性判据研究,支撑科研仿真与论文写作;④ 为多逆变器并联系统、微电网稳定性分析等课题提供建模工具与技术路线参考。; 阅读建议:建议读者结合Matlab代码与文中建模流程逐步调试,重点关注各子模块状态方程的推导与系统整体矩阵组装过程,深入理解控制参数对系统极点分布的影响规律,建议配合其他稳定性分析案例进行对比学习以加深理解。
内容概要:WiFiSupply斯普莱WFS7000XB52AX5G是一款高性能、工业级的5G全网通+双频WIFI6无线AP基站,支持5G与工业大功率Wi-Fi链路无缝切换与带宽聚合,具备高达2974Mbps的双频带宽和1000Mbps以上的实际吞吐量。设备采用MIMO 4T4R架构,支持OFDMA、AI智能FastRoaming等先进技术,实现低至20ms的漫游切换延迟和超远传输距离(点对点桥接可达150公里以上)。产品具备IP68防水、-45~85℃宽温运行、多重看门狗、防浪涌、防静电等工业级防护设计,适用于复杂恶劣环境。支持胖瘦AP模式、多种认证与管理方式(含云平台、API接口),并集成丰富的网络安全与QoS功能,适用于智慧物流、工业4.0、巡检机器人、无人机、车载船舶等多种场景。; 适合人群:从事工业物联网、智能制造、自动化物流、智能交通等领域的网络工程师、系统集成商、设备制造商及技术决策人员。; 使用场景及目标:①实现移动设备(如AGV/AMR/巡检机器人)在高速移动中的零丢包、低延迟无线漫游;②在无固定网络覆盖区域构建高带宽、高可靠的远距离无线通信链路;③为5G与工业Wi-Fi双链路备份与聚合提供一体化解决方案,保障关键业务连续性;④在复杂电磁环境下实现稳定、安全的数据传输与远程控制。; 阅读建议:本产品技术参数详尽,建议结合具体应用场景重点关注其无线性能、漫游技术、供电方式与安装选项,并参考官方提供的管理平台与API接口文档进行系统集成与远程运维规划。

7,655

社区成员

发帖
与我相关
我的任务
社区描述
Windows Phone是微软发布的一款手机操作系统,它将微软旗下的Xbox LIVE游戏、Zune音乐与独特的视频体验整合至手机中。
社区管理员
  • Windows客户端开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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