Как исправить низкую производительность Basler AviWriter - PullRequest
1 голос
/ 11 апреля 2019

Может быть, кто-то может помочь со следующей проблемой.Мне нужно написать просмотрщик для камер Basler Usb, который сможет записывать видео в avi-файл с использованием выбранного кодека.Я использую пилон SDK для создания приложения.И я столкнулся со следующей проблемой - объект AviWriter, предоставляемый библиотеками pylon, не записывает фреймы в avi-файл так же эффективно, как это делает стандартный просмотрщик pylon.Для тестирования я выбрал следующий пример кода, который был снабжен pylon SDK:

    internal static void Main()
    {

        int exitCode = 0;
        int counter = 0;

        try
        {

            using (Camera camera = new Camera())
            {

                camera.Open();

                camera.Parameters[PLCameraInstance.MaxNumBuffer].SetValue(1000);


                using (AviVideoWriter writer = new AviVideoWriter())
                {


                    byte[] ar = { };
                    writer.Create("test.avi", 35, PixelType.BGR8packed, 1280, 960, ImageOrientation.BottomUp, "msvc", 100, 0, 1, ref ar, true, (IntPtr)null);


                    camera.StreamGrabber.Start(1000); //1000 frames are to be grabbed

                    Console.WriteLine("Please wait. Images are being grabbed.");

                    while (camera.StreamGrabber.IsGrabbing)
                    {

                        IGrabResult grabResult = camera.StreamGrabber.RetrieveResult(5000, TimeoutHandling.ThrowException);


                        if (grabResult.GrabSucceeded)
                        {

                            ++counter;
                            writer.Write(grabResult);
                            Console.WriteLine("------->images written" + counter); 
                            Console.WriteLine("------->empty buffers" + camera.Parameters[PLCameraInstance.NumEmptyBuffers].GetValue()); //how many empty buffers left
                            grabResult.Dispose();
                        }
                        else
                        {
                            Console.WriteLine("Error: {0} {1}", grabResult.ErrorCode, grabResult.ErrorDescription);
                        }
                    }


                    camera.StreamGrabber.Stop();


                    writer.Close();
                }


                camera.Close();
            }
        }
        catch (Exception e)
        {
            Console.Error.WriteLine("Exception: {0}", e.Message);
            exitCode = 1;
        }
        finally
        {

            Console.Error.WriteLine("\nPress enter to exit.");
            Console.ReadLine();
        }

        Environment.Exit(exitCode);
    }

Проблема заключается в следующем.При прочих равных условиях (кодек, разрешение) стандартное приложение pylon записывает кадры в avi-файл в 1,5-2 раза эффективнее, чем AviWriter в образце.Я имею в виду, что в случае стандартного приложения pylon камера может писать без заполнения буфера вообще. Буфер камеры в примере будет заполнен довольно быстро.Мой вопрос: есть ли способы ускорить добавление кадров в файл avi с помощью объекта AviWriter из pylon SDK?Может, кто-то сталкивался с этой проблемой и решил ее как-нибудь?Кстати, я также протестировал пример кода C ++, и проблема остается.

...