Laden...

Video auf zwei Monitoren ausgeben

Letzter Beitrag vor 13 Jahren 11 Posts 2.823 Views
Video auf zwei Monitoren ausgeben

Hallo alle zusammen,

ich suche gerade einen Ansatz, wie man ein Video auf zwei Monitoren ausgeben könnte. Es handelt sich dabei um eine Präsentations-Software bei der das Video zum einen auf dem Lehrerbildschirm in einem kleinen Bereich ausgegeben wird und zum anderen auf dem Beamer in Vollbild.
Realisieren will ich das ganze eigentlich per WPF, wobei das jetzt noch offen ist.

Wie kann man das am besten anpacken? Ich befürchte, dass einzelne Bilder dafür einfach zu langsam sein werden. Evtl. bräuchte man eine Lösung, dass man über einen Pin Tee Filter die Ausgabe auf zwei VideoRenderer splittet, wodurch ich aber zu dem Problem komme, dass man bei WPF keine Window Handles für die einzelnen Controls hat, soviel ich weiß.

Vielleicht kann man irgendwie einen Stream erzeugen, der dann gleichzeitig von zwei MediaElementen wieder gegeben wird, aber auch da fehlt mir der Ansatz.

Hat da vielleicht jemand ein paar Ideen?

Vielen Dank schon mal

Hast Du mal an Direct-X(Show) gedacht bzw. damit Erfahrung?

Ja. Das wär ja genau der Ansatz mit dem Pin Tee Filter. Nur wie kann man bei WPF dann die Ausgaben einem Control/Window zuweisen, wenn man keine Handles hat? Also für ein Window bekomm ich ja noch ein Handle mit dem WindowInteropHelper, aber auf dem Lehrerschirm will ich die Ausgabe ja nicht im gesamten Fenster machen sondern nur auf einem Control und das dürfte doch dann nicht klappen.

ich muss dazu sagen, dass ich das jetzt noch nicht ausprobiert habe, weil ich mir im moment lediglich Gedanken darüber machen, wie man das am sinnvollsten lösen kann.

EDIT: Ideal wär eigentlich eine Lösung, dass man auf dem Lehrerschirm das mediaElement hat und ganz normal in WPF manier arbeiten kann. Den Stream des MediaElements müsste man dann anzapfen und eine zweite Ausgabe auf das zweite Window legen, das auf dem Beamer angezeigt wird.
Das heißt, ich bräuchte eine Lösung, wie ich den Stream des MediaElements anzapfen kann.

Hallo Mossi,

hast du schon mal probiert, das Video zweimal abzuspielen, in zwei unabhängigen Controls? Der springend Punkt wäre ob und wie stark die out-of-sync kommen.

herbivore

Das war mein erster Versuch in der Richtung und das hat auf meinem Rechner ganz gut funktioniert. Dann wollt ich das Konzept auf dem Testrechner zeigen und da war dann nichts mehr mit synchron. Diese Arbeitsweise ist halt sehr abhängig von der Rechnerperformance.

Ich hab jetzt allerdings einen Test gestartet, dass ich meinen Graph selber zusammenbau und mit einem Pin Tee Filter versehe. Dadurch, dass ich zwei Fenster habe, kann ich auch zwei Handles rausholen. Das eine Handle (Beamer) bekommt den Stream als Vollbild indem ich IVideoWindow auf die volle Größe festlege (SetWindowPosition). Für den Lehrerschirm setze ich die WindowPosition bloß auf einen Bereich. Ich glaube, dass ich damit alles hinbekommen sollte. Ist nur leider vollkommen an WPF vorbei programmiert und gerade bei einem Multimedia-Framework wie WPF finde ich das ehrlich gesagt ziemlich schade.

Hallo,

in WPF kannst Du mit einem MediaElement und einem VisualBrush arbeiten. Ich kann allerdings nicht ausprobieren, ob das auch mit zwei Monitoren (also zwei Grafikadaptern oder etwas wie Eyefinity) funktionieren wird.

Ok. Jetzt hab ich zwei Lösungen. Einmal die oben erwähnte, die ja eher an WPF vorbei geht. Aber es funktioniert sehr zuverlässig und das schöne ist, dass man direkt in den Graph eingreifen kann (auch eine Sache, die ich dringend benötige)

Dann aber die schönere Möglichkeit: Ich hab http://wpfmediakit.codeplex.com/ gefunden und von da hab ich jetzt zum Testen mal das MediaUriElement verwendet. Wie ujr schon vorgeschlagen hat, hab ich davon dann einen VisualBrsuh im zweiten Fenster erstellt. Funktioniert einwandfrei und man kann so dann auch noch ein bisschen mit den Effekten rumspielen.

Jetzt muss ich dann nur noch das MediaUriElement mal genauer anschauen, ob man da den Graph anpassen kann oder gegebenenfalls noch das Ding ein bisschen erweitern.

Es würde wahrscheinlich auf diese Weise auch mit dem normalen MediaElement funktionieren, aber da man da keinerlei Möglichkeiten hat auf den Graph zuzugreifen, ist das dann für mich ziemlich uninteressant.

Achja: Um die ursprüngliche Frage selbst zu beantworten: Ich hab einfach ein zweites Fenster erstellt, wobei ich die Größe an System.Windows.Forms.Screen.AllScreens[1].WorkingArea angepasst habe. WindowStyle = none und WindowState = maximized machen dann noch den Rest, damit der komplette Monitor ausgefüllt wird.
Ein bisschen unschön, dass man auf eine Forms-Sache zugreifen muss, aber da find ich vielleicht bei Zeiten auch noch eine andere Lösung

Hi,

in WPF kannst du die SystemParameters dafür benutzen:


System.Windows.SystemParameters.WorkArea

s. How can I get the active screen dimensions?

Leider gibt es nur Eigenschaften für den primären Bildschirm direkt dafür.
Intern wird bei Screen.AllScreens[x] aber auch nur die GetMonitorInfo-Funktion aufgerufen, welche du auch selber über GetMonitorInfo (user32) ansprechen kannst.

Einmal die oben erwähnte, die ja eher an WPF vorbei geht. Aber es funktioniert sehr zuverlässig und das schöne ist, dass man direkt in den Graph eingreifen kann (auch eine Sache, die ich dringend benötige)

Eine Lösung über "Controls" (nicht Fenster) könnte der WindowsFormsHost in Verbindung mit einem fensterlosen (also "windowless") Renderer sein.

Nachteil ist, dass u. U. nicht alle "Effekte" (Animationen, Transformationen, ...) funktionieren. Wenn man diese aber nicht braucht, klappt das sehr gut.

Interessant wäre ja die Frage, warum in den Graphen eingegriffen werden muss bzw. welche Funktionalität dann am MediaElement fehlt.

@Cat: Danke. Das hab ich schonmal irgendwo gehört, aber vollkommen vergessen. Muss ich mir nochmal anschauen. Wobei ich ja dann dennoch wohl auf die Win32 API ausweichen muss. Aber mal schauen. Da mach ich mir noch irgendwann mal Gedanken. Lösungen gibt es auf jeden Fall dafür genügend denke ich.

@Ujr: Die Sache mit DirectShow ist allgemein viel zu wacklig. Wenn man sich mit seinem Rechner auskennt, kann man sich in der Regel selber helfen und ein paar Codec-Packs installieren, die man eben braucht. Aber der Ottonormal-Verbraucher sieht einfach nur, dass es nicht geht und hat keine Ahnung warum. Dass er durch Spiel XY, Irgendeinen Webcam-Chat und noch einen DVD-Player seine ganzen Filter-Einstellungen auf dem Rechner verändert hat und sich diese auf das gesamte System auswirken, weiß er ja nicht. Daher geben wir fest vor, welche Filter verwendet werden und liefern die auch mit der Software mit aus. Damit sind wir ziemlich unabhängig vom System und es ist sehr unwahrscheinlich, dass uns eine andere Software dazwischen funkt.
Eine andere, sicherere Möglichkeit haben wir leider noch nicht gefunden, wie man es schafft, dass Videos (immer das gleiche Format) auf jedem System immer laufen. Wenn da jemand eine Idee hat, nur her damit.

Ok. Doch noch nicht erledigt.

Auf meinem PC hier funktioniert es ein wand frei. Auf meinem Laptop mit einer GForce Quadro FX 1600M mit 256MB Grafikspeicher läuft es nur noch sehr stockend, wenn ich den VisualBrush aktiviert habe.
Ich muss also noch nach einer performanteren Lösung suchen.