Problem z rejestracją ekranu za pomocą klasy Microsoft.Expression.Encoder.ScreenCapture

Problem z rejestracją ekranu za pomocą klasy Microsoft.Expression.Encoder.ScreenCapture
MS
  • Rejestracja:około 8 lat
  • Ostatnio:około 8 lat
  • Postów:2
0

Witam,

Mam następujący problem. Napisałem program, którego zadaniem jest rejestracja obrazu ekranu. W tym celu skorzystałem z klasy Microsoft.Expression.Encoder.ScreenCapture. Dla pierwszego ekranu (laptop) wszystko działa poprawnie. Tworzy się plik *.xesc z zarejestrowanym obrazem. Natomiast dla drugiego ekranu (dołączony monitor) obraz co prawda zostaje zarejestrowany, jednak po otwarciu pliku okazuje się, że nagrany obraz ekranu jest pomniejszony i zajmuje tylko część pełnego pola obrazu. Czy ktoś wie co można zrobić, żeby w tym przypadku obraz ekranu również zajął cały obszar obrazu video? Poniżej wklejam metody napisane przeze mnie dla celów rejestracji obrazu:

Kopiuj
        public bool StartRecording
        {
            get
            {
                return startrecording;
            }
            set
            {

                if (RecordingInOperation)
                {
                    StopRecording = true;
                }

                startrecording = value;

                if (Directory.Exists(DirectoryPath.Substring(0, DirectoryPath.IndexOf("\\") + 1)) && value && !this.StopRecording)
                {
                    try
                    {
                        

                        job = new ScreenCaptureJob();

                        Rectangle Resolution = Screen.AllScreens[ScreenID].Bounds;

                        int offset = 0;

                        for (int i = 0; i < ScreenID; i++)
                        {
                            offset += Screen.AllScreens[i].Bounds.Width;
                        }


                        job.ScreenCaptureVideoProfile.Quality = this.Quality;
                        job.ScreenCaptureVideoProfile.FrameRate = this.FrameRate;
                        ConstantBitrate b = new ConstantBitrate(this.BitRate);
                        job.ScreenCaptureVideoProfile.Bitrate = b;
                     
                        
                        // Sets the top right coordinates of the capture rectangle
                        int topRightX = offset;
                        int topRightY = 0;
                        // Sets the bottom left coordinates of the capture rectangle
                        int BottomLeftX = topRightX + Resolution.Width;
                        int BottomLeftY = topRightY + Resolution.Height;

                        //job.CaptureRectangle = new Rectangle(topRightX, topRightY, BottomLeftX, BottomLeftY);
                        job.CaptureRectangle = new Rectangle(topRightX, topRightY, BottomLeftX, BottomLeftY);

                        job.ScreenCaptureVideoProfile.AutoFit = true;
                
                        job.ShowFlashingBoundary = false;

                        

                        job.OutputScreenCaptureFileName = DirectoryPath + @"\" + FileNamePrefix + "_" + DateTime.Now.Year.ToString("0000") + DateTime.Now.Month.ToString("00") + DateTime.Now.Day.ToString("00") + "_" + DateTime.Now.Hour.ToString("00") + DateTime.Now.Minute.ToString("00") + DateTime.Now.Second.ToString("00") + ".xesc";
                        job.Start();
                       
                        startTim = DateTime.Now;
                        recording = true;
                        try
                        {
                            RecordingStatusChanged();
                        }
                        catch (Exception)
                        {

                        }

                    }
                    catch (Exception)
                    {
                        throw;
                    }
                    this.StartRecording = false;
                }
            }
        }

        
        public bool StopRecording
        {
            get
            {
                return stoprecording;
            }
            set
            {
                stoprecording = value;

                if (value && !this.StartRecording)
                {
                    try
                    {
                        recording = false;
                        job.Stop();
                        try
                        {
                            RecordingStatusChanged();
                        }
                        catch (Exception)
                        {

                        }
                    }
                    catch(Exception)
                    {
                        throw;
                    }
                    this.StopRecording = false;
                }
            }
        }
edytowany 1x, ostatnio: MaciejSz89
mad_penguin
mad_penguin
Tak nie w temacie: w DateTime.ToString może użyj tego do formatowania daty, będzie przejrzyściej https://msdn.microsoft.com/pl-pl/library/8kb3ddd4(v=vs.110).aspx
mariano901229
  • Rejestracja:ponad 10 lat
  • Ostatnio:8 miesięcy
  • Postów:597
0

Nigdy nie korzystałem z tej biblioteki dlatego moja odpowiedź może być całkowicie błędna, ale wytłumacz co ten kawałek kodu robi. Wrzucasz sobie do klasy tylko Rectangle roździelczość ekranu określonego przez zmienną ScreenID. Następnie do zmiennej offset dodajesz szerokość wszystkich ekranów, który później wykorzystujesz do określenie położenia obrazu. Czyli wartość w offset będzie miała szerokość ekranu z laptopa + ekranu monitora, a w Rectangle masz wartości tylko z ekranu po ScreenID. Powtarzam mogę się mylić nie analizowałem kodu w IDE, nie znam biblioteki to strzał taki pierwszy na sucho, ale może pomoże.

Kopiuj
     Rectangle Resolution = Screen.AllScreens[ScreenID].Bounds;

      int offset = 0;

       for (int i = 0; i < ScreenID; i++)
       {
              offset += Screen.AllScreens[i].Bounds.Width;
       }

       int topRightX = offset;
edytowany 1x, ostatnio: mariano901229
MS
  • Rejestracja:około 8 lat
  • Ostatnio:około 8 lat
  • Postów:2
0

Przyjąłem numerację od zera. W związku z tym dla ScreenID=0 offset=0 (czyli lewa krawędź ekranu laptopa). Dla ScreenID=1 offset będzie równy szerokości ekranu laptopa, a zatem lewa krawędź nagrywanego ekranu pokryje się z lewą krawędzią dodatkowego monitora. Pod tym kątem program na pewno działa poprawnie, bo rzeczywiście nagrywa odpowiednie ekrany dla odpowiednich wartości ScreenID. Problem polega na tym, że gdy otwieram film z nagranym prawym ekranem, to zajmuje on jedynie część obrazu video Przechwytywanie.JPG

edytowany 1x, ostatnio: MaciejSz89

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.