【发布时间】:2013-04-08 12:23:18
【问题描述】:
我使用非托管库从 IP 摄像机获取视频流。 有功能:
[DllImport("client.dll", EntryPoint = "Network_ClientStartLive", SetLastError = true)]
protected static extern int Network_ClientStartLive(
ref IntPtr pStream,
IntPtr hDev,
IntPtr pClientInfo,
[MarshalAs(UnmanagedType.FunctionPtr)] ReadDatacbf lpfnCallbackFunc = null,
UInt32 dwUserData = 0
);
pClientInfo 是指向以下结构类型的指针:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
protected struct LiveConnect
{
public UInt32 dwChannel;
public IntPtr hPlayWnd;
public UInt32 dwConnectMode;
}
其中hPlayWnd 是必须输出视频流的窗口句柄。
该库通过此窗口的大小检测视频分辨率(在调用Network_ClientStartLive 期间)。我在 C++ MFC 程序上检查了它,其中输出窗口为 Picture control,并通过使用方法 MoveWindow 设置大小来定义输出视频分辨率。
在这个程序的 C# 版本中,我使用 PictureBox-control 来绘制视频流。视频显示,但PictureBox 的大小不影响视频流分辨率。我尝试了几种方法来改变PictureBox的大小:
- 设置
pictureBox.Size - 使用 WinAPI
SetWindowPos:
在这两种方法中,控件的大小都发生了变化,但相机库继续以最大分辨率输出视频流。
我该如何解决这个问题?
谢谢!
【问题讨论】:
-
我想不出故障模式,就非托管代码所关心或看到的而言,.NET PictureBox 和非托管图片控件之间没有根本区别。考虑您传递错误窗口句柄的可能性。像表单或桌面的(空)。联系相机库供应商或作者寻求支持,他们可以轻松调试。
-
我也怀疑句柄不对。将您传递给日志的句柄写入日志,并在您的应用程序运行时,使用 Spy++ 实用程序选择图片框。如果句柄 Spy++ 与您记录的句柄不匹配,您就会知道发生了什么事。