Dwa monitory i karta Dual View

Dwa monitory i karta Dual View
WI
  • Rejestracja:prawie 17 lat
  • Ostatnio:około rok
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.

cyriel
  • Rejestracja:około 18 lat
  • Ostatnio:ponad 10 lat
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 ;-) )


Pisze programy/skrypty na zlecenie/zaliczenie - c/c++/asembler/java. GG - 2100119, mail w profilu.
WI
  • Rejestracja:prawie 17 lat
  • Ostatnio:około rok
0

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

entek
  • Rejestracja:prawie 20 lat
  • Ostatnio:prawie 4 lata
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.

Kopiuj
  FilterGraph1.ClearGraph;
  FilterGraph2.ClearGraph;
  FilterGraph1.Active := True;
  FilterGraph2.Active := True;
  FilterGraph2.RenderFile('xy.avi');
  FilterGraph1.RenderFile('yz.avi');
  FilterGraph1.Play;
  FilterGraph2.Play;
WI
  • Rejestracja:prawie 17 lat
  • Ostatnio:około rok
0

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

entek
  • Rejestracja:prawie 20 lat
  • Ostatnio:prawie 4 lata
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

Kopiuj
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:

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

//w przypadku Trybu EVR robię tak:

Kopiuj
        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:

Kopiuj
            
//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

Kopiuj
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:

Kopiuj
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ę

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

Dalej już chyba sobie poradzisz :)

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.