c#.NET中网络视频播放器的多视图显示

时间:2014-09-23 14:38:46

标签: c# video-player multiview

我尝试实现一个最多可以显示16个视频流的视频播放器。我从IP摄像机获取流并使用我的“转换器”对象将它们转换为位图图像,这是我的C ++ DLL中的一个类。为每个摄像机创建“转换器”对象。 我在Windows窗体上创建了16个图片框。然后,我设置了16个图片框的背景图像,其中包含从“转换器”对象接收的位图。然后我刷新图片框。但是,当我制作这样的设计时,API冻结了例如;无法点击媒体播放器上的按钮,我无法将媒体播放器最小化到任务栏。按钮不起作用。 如何每隔40毫秒(25fps)在Windows窗体上显示这16个位图图像?还有另一种使用面板或图片框的方法吗?

感谢您的建议。 编辑 - >我添加代码,我显示每个图片框的图像。 .NET部分中的每个播放器对象(与IP摄像机一样多)都有此线程在图片框中显示RTP流。

    private void DisplayFrameThread()
    {
        while (true)
        {
            try
            {
                //Stopwatch sw = new Stopwatch();

                object message = mSyncDisplayFrameQueue.DequeueBlocking();
                RtpFrame frame = (RtpFrame)message;

                byte[] myRaw264 = Utils.GetH264Frame(frame);
                if (cudaDecoder.decodeH264Frame(myRaw264, myRaw264.Length))
                {
                    bool retVal = false;
                    //sw.Start();
                    byte[] bmpImageData = cudaDecoder.getDecodedBMPFrame(ref retVal);//~7 ms in Release mode in 1080p
                    // sw.Stop();
                    // Console.WriteLine("getDecodedBMPFrame in DisplayFrameThread" + " takes :" + sw.ElapsedMilliseconds.ToString() + " ms");
                    if (retVal)
                    {
                        //count++;
                        Bitmap bmp = (Bitmap)Bitmap.FromStream(new MemoryStream(bmpImageData), false, false);//0 ms..if validateImageData is made TRUE, then 3 ms.
                        picBox.BackgroundImage = bmp;
                        picBox.Refresh();
                    }
                }
            }
            catch (Exception ex)
            {

                Console.WriteLine("Error in DisplayFrameThread -> " + ex.Message);
            }
            Thread.Sleep(1);
        }
    }

0 个答案:

没有答案