8

我使用非托管库从 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;
}

wherehPlayWnd是必须输出视频流的窗口句柄。该库通过此窗口的大小检测视频分辨率(在调用期间Network_ClientStartLive)。我在 C++ MFC 程序上检查了它,输出窗口在哪里,Picture control并通过使用方法设置大小来MoveWindow定义输出视频分辨率。

在这个程序的 C# 版本中,我使用PictureBox-control 来绘制视频流。视频显示,但大小PictureBox不影响视频流分辨率。我尝试了几种方法来改变PictureBox大小:

  1. 环境 pictureBox.Size
  2. 使用 WinAPI SetWindowPos
[DllImport("user32.dll")]
私有静态外部布尔 SetWindowPos(
    IntPtr hWnd,
    IntPtr hWndInsertAfter,
    整数 x,
    整数,
    整数宽度,
    整数高度,
    uint uFlags);

在这两种方法中,控件的大小都发生了变化,但相机库继续以最大分辨率输出视频流。

我怎么解决这个问题?

谢谢!

4

1 回答 1

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 中)将是一个有用的程序,用于监视消息并确保句柄值和事件符合您的预期。

于 2013-12-27T14:38:56.517 回答