我使用非托管库来从IP Camera获取视频流 . 有功能:
[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
:
[DllImport("user32.dll")]
private static extern bool SetWindowPos(
IntPtr hWnd,
IntPtr hWndInsertAfter,
int x,
int y,
int width,
int height,
uint uFlags);
在这两种方法中,控件的大小都已更改,但相机库继续以最大分辨率输出视频流 .
我怎么解决这个问题?
谢谢!
1 回答
Windows窗体中的每个控件都有一个SizeChanged(http://msdn.microsoft.com/en-us/library/system.windows.forms.control.sizechanged(v=vs.110).aspx)事件 . 也许可以在此事件处理程序中手动添加代码来更改视频分辨率?如果没有,您提供的PictureBox句柄可能不会发送WM_SIZE消息,这将是非托管库将要查找的内容 . 正如其中一条评论中所提到的,Spy(包含在Visual Studio中)将是一个有用的程序来监视消息,并确保句柄值和事件是您期望的 .