Dwa monitory i karta Dual View

0

Witajcie. Zastanawiam sie nad pewnym rozwiazaniem ale nie wiem czy jest ono w ogole mozliwe do zrealizowania. Na kompie ktory ma karte graficzna mogaca obsluzyc dwa monitory na raz czyli tzw Dual View uruchamiam dwa programy napisane w delphi ktore odtwarzaja przez dspacka dwa rozne filmiki. Czy mozna zrobic tak zeby jeden program/filmik pokazywany byl na jednym monitorze a drugi na drugim ?
Pozdrawiam.

0

Jesli komp wyrobi to tak. Problemem może być dźwięk(raczej nie chcesz słyszeć dźwięku z obu filmów jednoczśnie ;-) )

0

Oki ale jak to zrobic bo technicznie nie wiem jak to by wygladalo.

0

Musisz utworzyć dwa osobne Grafy korzystając z video rendera VMR lub EVR.
(Video renderer overlay ma możliwość wyświetlania obrazu tylko na jednym monitorze)

Następnie przypisujesz okno video1 do monitora1, zaś okno video2 do monitora2.

  FilterGraph1.ClearGraph;
  FilterGraph2.ClearGraph;
  FilterGraph1.Active := True;
  FilterGraph2.Active := True;
  FilterGraph2.RenderFile('xy.avi');
  FilterGraph1.RenderFile('yz.avi');
  FilterGraph1.Play;
  FilterGraph2.Play;
0

Entek dziekuje za info a mozesz jeszcze napisac w jaki sposob przypisac okna video do monitorow ?

0

Troszkę będziesz musiał pokombinować, zobacz do pliku dspack.pas jak wyglada procedura "procedure TVideoWindow.SetFullScreen(Value: boolean);"

Idea jest taka, że tworzysz nowe okno o rozmiarach monitora1 lub monitora2. Lub zmieniasz parametry aktualnego okna odtwarzającego video, by posiadało rozmiary aktualnego monitora.

//przykładowe pobranie rozmiarów danego monitora

var
 MBounds,MBounds2: TRect;    //Size of monitor screen

Begin
MBounds2 := Screen.monitors[1].BoundsRect //(1280, 0, 2304, 768, (1280, 0), (2304, 768)) TV lub monitor 2
MBounds := Screen.monitors[0].BoundsRect; //(0, 0, 1280, 1024, (0, 0), (1280, 1024)) monitor 1
end;

Albo:

var
 Monitor,Monitor2 : TMonitor;
Begin
Monitor := Screen.Monitors[0];
Monitor2 := Screen.Monitors[1];
end;

//w przypadku Trybu EVR robię tak:

        with form1 do
        begin
          Foldbounds := Form1.BoundsRect;//zapamietuje aktualne rozmiary
          BorderIcons := [];
          BorderStyle := bsNone;
          menu := nil;
//ustawiam rozmiary i pozycje formy na danym monitorze
          SetBounds(MBounds.Left, MBounds.Top, (MBounds.Right-MBounds.Left),(MBounds.Bottom-MBounds.Top));
        end;
//interfejs do renderera video ustawi obraz
         if assigned (FDisplayControl) then FDisplayControl.SetVideoWindow(form1.Handle);

W przypadku WMR jest w kodzie dspacka coś takiego:

            
//zmień styl okna
CheckDSError(FVideoWindow.put_Owner(0));
            CheckDSError(FVideoWindow.put_WindowStyle(FWindowStyle and not(WS_BORDER or WS_CAPTION or WS_THICKFRAME)));
            StyleEX := FWindowStyleEx and not(WS_EX_CLIENTEDGE or WS_EX_STATICEDGE
              or WS_EX_WINDOWEDGE or WS_EX_DLGMODALFRAME);
            if FTopMost then StyleEX := StyleEX or WS_EX_TOPMOST;
            CheckDSError(FVideoWindow.put_WindowStyleEx(StyleEX));

//interfejs IVideoWindow ustawi pozycje okna na danym monitorze
             FVideoWindow.SetWindowPosition ((Monitor.Left),(Monitor.Top),(Monitor.Width),(Monitor.Height));

Nie próbowałem wyświetlania dwóch filmów. Ale spróbowałbym tak:
Musisz wyrenderować strumienie, następnie pobrać interfejsy do IVideoWindow

CheckDSError(FBaseFilter.QueryInterface(IVideoWindow, FVideoWindow));
CheckDSError(FBaseFilter2.QueryInterface(IVideoWindow, FVideoWindow2));

Zmieniasz style okien by zajęły cały obszar ekranu i przypisujesz im video z renderera:

FVideoWindow.SetWindowPosition ((Monitor.Left),(Monitor.Top),(Monitor.Width),(Monitor.Height))
FVideoWindow2.SetWindowPosition ((Monitor2.Left),(Monitor2.Top),(Monitor2.Width),(Monitor2.Height))

Myślę, iż aby to w prosty sposób zrobić, musiałbyś zmodyfikować plik dspack.pas, a konkretnie procedurę

TVideoWindow.SetFullScreen(Value: boolean); na:
TVideoWindow.SetFullScreen(Value: boolean; MonitorNumer : integer);"

Dalej już chyba sobie poradzisz :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1