Захват потока камеры через SDK, который требует IntPtr to Window в WPF (без проблем с воздушным пространством) - PullRequest
0 голосов
/ 11 марта 2020

У меня есть SDK для IP-камеры, и функция, отвечающая за начало приема потока, требует IntPtr to Window, который будет использоваться для отображения потока. В WPF я могу только отображать изображение в то время как окно, потому что только окно имеет дескриптор в WPF. Я пытался открыть новое окно и скопировать контент в какой-то элемент управления в главном окне, но без особого успеха. Есть ли возможность, например, сделать фиктивный IntPtr и каким-то образом получить из него изображение / поток?

[DllImport("dhnetsdk.dll")]
    public static extern IntPtr CLIENT_StartRealPlay(IntPtr lLoginID, int nChannelID, IntPtr hWnd, EM_RealPlayType rType, fRealDataCallBackEx cbRealData, fRealPlayDisConnectCallBack cbDisconnect, IntPtr dwUser, uint dwWaitTime);

1 Ответ

1 голос
/ 11 марта 2020

Вы можете использовать System.Windows.Media.Imaging.WriteableBitmap и передать его дескриптор IntPtr для вызова SDK камеры.

Вот пример:

private void VideoSampleReady(byte[] sample, uint width, uint height, int stride, WriteableBitmap wBmp, System.Windows.Controls.Image dst)
{
    if (sample != null && sample.Length > 0)
    {
        this.Dispatcher.BeginInvoke(new Action(() =>
        {
            if (wBmp == null || wBmp.Width != width || wBmp.Height != height)
            {
                wBmp = new WriteableBitmap(
                    (int)width,
                    (int)height,
                    96,
                    96,
                    PixelFormats.Bgr24,
                    null);

                dst.Source = wBmp;
            }

            // Reserve the back buffer for updates.
            wBmp.Lock();

            Marshal.Copy(sample, 0, wBmp.BackBuffer, sample.Length);

            // Specify the area of the bitmap that changed.
            wBmp.AddDirtyRect(new Int32Rect(0, 0, (int)width, (int)height));

            // Release the back buffer and make it available for display.
            wBmp.Unlock();
        }), System.Windows.Threading.DispatcherPriority.Normal);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...