我尝试实现一个最多可以显示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);
}
}