我使用非托管库从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
- 控件来绘制视频流。视频会显示,但PictureBox
的大小不会影响视频流的分辨率。我尝试了几种方法来更改PictureBox
大小:
pictureBox.Size
SetWindowPos
:[DllImport("user32.dll")] private static extern bool SetWindowPos( IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int width, int height, uint uFlags);
在这两种方法中,控件的大小都已更改,但相机库继续以最大分辨率输出视频流。
我该如何解决这个问题?
谢谢!
答案 0 :(得分: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中)将是一个有用的程序来监视消息,并确保句柄值和事件是您期望的。