我使用非托管库从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
控件来绘制视频流。视频可以正常显示,但是 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);
在这两种方法中,控件的大小都被改变了,但是摄像头库仍然以最大分辨率输出视频流。
我该如何解决这个问题呢?
谢谢!