NSView > Inhalt synchron zu anderem NSView zeigen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • NSView > Inhalt synchron zu anderem NSView zeigen

    Hallo,

    folgendes Szenario:

    - Anwendung wird geöffnet
    - es öffnet sich ein Fenster, das ein Video abspielt
    - es öffnet sich ein Fenster, das ein WebView anzeigt
    - im dritten Fenster, also das Hauptfenster, soll der Inhalt von Fenster 1, oder von Fenster 2 sichtbar sein

    Die Inhalte aus beiden Anzeigefenstern sind dynamisch.
    Wie kann ich deren Darstellung in ein anderes NSView gespiegelt anzeigen?

    Klar, ich könnte alle 0,1 Sekunden ein NSImage von dem Ding aufnehmen und anzeigen, aber das scheint mir sehr suboptimal.

    Kennst jemand eine andere Möglichkeit?

    Danke.

    Viele Grüße
  • Hast du Lust mal genauer zu erklären wozu genau das gut ist, dass man in zwei Fenstern das gleiche sieht? Also ich stelle mir vor du kannst doch dann auch genauso gut immer das Fenster das du anzeigen willst vor das hauptfenster moven....

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Noch kurz zum Szenario, wie das Ganze verwendet wird:

    - Anwender startet Anwendung
    - an dem Rechner sind mehrere Monitore angesteckt
    - die Monitore sind für den Anwender nicht sichtbar
    - auf jedem Monitor wird ein Fenster geöffnet, das ein Video, WebView etc. zeigt
    - die Inhalte der Fenster sind dynamisch und verändern sich permanent
    - der Anwender sitzt vor dem Hauptbildschirm und dem Hauptfenster
    - am Hauptbildschirm soll sich Anwender, je nach dem was er gerade "beobachten" möchte, Bildschirm 1 etc. ansehen können
    - je nach dem was gerade auf einem bestimmten Bildschirm gezeigt wird, wird der Anwender bestimmte Aktionen auslösen
    - der Anwender weiß, z.B. ab Minute 3 beobachte Bildschirm 2, dann wartet er bis das gewünschte Vorkommen passiert ist und löst eine Folgeaktion aus
    - etc.

    Einsatzbereich: Veranstaltungstechnik

    Viele Grüße
  • Noch eine Anmerkung:

    Problematisch ist nur das Video-Zeugs.
    Natürlich könnte ich am Hauptfenster auch das Video ablaufen lassen, wie z.B. auf Bildschirm 3.
    Aber das ist total plöht, da man das nie synchron bekommt, wenn man z.B. bei 1:23 von Bildschirm 2 dann eben auf 3 wechselt.
    Somit könnte der Anwender zu spät reagieren, da sein Video im Hauptfenster eine Sekunde nachläuft.

    Deshalb wäre es viel klüger, wenn man einfach den Inhalt von einem NSView "streamen" könnte.

    Viele Grüße
  • Hallo,

    Weiß Du denn was auf den anderen Views in dem Moment angezeigt wird

    Ja, ich weiß z.B. welches Video gerade abgespielt wird.

    Leider bringt mir nur das so nichts.
    Wenn der Anwender sich den Inhalt von Bildschirm 2, also View 2, zeigen lasse möchte, dann müßte ich abfragen, welches Video läuft und an welcher Position ist es.
    Im Hauptfenster müßte ich dann auch das Video laden und zu der abgefragten Position springen. Das klappt nicht gut und die Videos laufen dann nie synchron.

    Gleiches Problem bei der Animation. Auf einem anderen View läuft endlos eine Animation.
    Deren Zustand müßte ich komplett abfragen und auf dem Hauptbildschirm herstellen und genaus so weiter laufen lassen.

    Es ist einfach viel besser, wenn man einfach immer das Quell-View in das Ziel-View spiegelt.
    Ich habe das jetzt mit Snapshots versucht und das klappt eigentlich super.
    Ich dachte nur, dass das eher "dreckig" ist und es einen alternativen Weg gibt.

    Viele Grüße
  • K.A. ob das mir nem Webview ein Gefrickel wird, aber mit einem "normalen" view sollte das doch ein gangbarer Weg sein, oder?

    In dem WebView wird eine spezielle Seite aufgerufen, die sich selbst mit JavaScript etc. dynamisch verändert.
    Auch diesen Zustand in dem Hauptfenster herzustellen ist wieder sehr kompliziert.

    View auf ein anderes spiegeln ist besser…

    Viele Grüße
  • little_pixel schrieb:

    Noch kurz zum Szenario, wie das Ganze verwendet wird:

    - Anwender startet Anwendung
    - an dem Rechner sind mehrere Monitore angesteckt
    - die Monitore sind für den Anwender nicht sichtbar
    - auf jedem Monitor wird ein Fenster geöffnet, das ein Video, WebView etc. zeigt
    - die Inhalte der Fenster sind dynamisch und verändern sich permanent
    - der Anwender sitzt vor dem Hauptbildschirm und dem Hauptfenster
    - am Hauptbildschirm soll sich Anwender, je nach dem was er gerade "beobachten" möchte, Bildschirm 1 etc. ansehen können
    - je nach dem was gerade auf einem bestimmten Bildschirm gezeigt wird, wird der Anwender bestimmte Aktionen auslösen
    - der Anwender weiß, z.B. ab Minute 3 beobachte Bildschirm 2, dann wartet er bis das gewünschte Vorkommen passiert ist und löst eine Folgeaktion aus
    - etc.

    Einsatzbereich: Veranstaltungstechnik

    Viele Grüße

    Klingt mir eher nach einem Einsatzfall für VNC.
    Da wird auch regelmäßig der Bildschirminhalt als Pixel abgefragt und Änderungen als komprimierte JPEG weitergegeben.
  • hns schrieb:

    little_pixel schrieb:

    Noch kurz zum Szenario, wie das Ganze verwendet wird:

    - Anwender startet Anwendung
    - an dem Rechner sind mehrere Monitore angesteckt
    - die Monitore sind für den Anwender nicht sichtbar
    - auf jedem Monitor wird ein Fenster geöffnet, das ein Video, WebView etc. zeigt
    - die Inhalte der Fenster sind dynamisch und verändern sich permanent
    - der Anwender sitzt vor dem Hauptbildschirm und dem Hauptfenster
    - am Hauptbildschirm soll sich Anwender, je nach dem was er gerade "beobachten" möchte, Bildschirm 1 etc. ansehen können
    - je nach dem was gerade auf einem bestimmten Bildschirm gezeigt wird, wird der Anwender bestimmte Aktionen auslösen
    - der Anwender weiß, z.B. ab Minute 3 beobachte Bildschirm 2, dann wartet er bis das gewünschte Vorkommen passiert ist und löst eine Folgeaktion aus
    - etc.

    Einsatzbereich: Veranstaltungstechnik

    Viele Grüße

    Klingt mir eher nach einem Einsatzfall für VNC.
    Da wird auch regelmäßig der Bildschirminhalt als Pixel abgefragt und Änderungen als komprimierte JPEG weitergegeben.


    Wobei auch das bei laufendem Video (am besten noch in Vollbild) sicher nicht besonders performant werden dürfte.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Hallo,

    es gibt Neuigkeiten:

    Markus Müller hat mich in einem anderen Thread auf AVFoundation hingewiesen.
    Damit habe ich gleich dieses Problem hier erschlagen. Code, siehe unten.

    Funktioniert genau so, wie ich das benötige.

    Viele Grüße

    Quellcode

    1. -(BOOL)prepareCaptureSession
    2. {
    3. // …
    4. NSView *view = [self view];
    5. if(view == nil)
    6. {
    7. return NO;
    8. }
    9. // …
    10. [view setWantsLayer:YES];
    11. // …
    12. CALayer *layer = [view layer];
    13. if(layer == nil)
    14. {
    15. return NO;
    16. }
    17. // …
    18. CGDirectDisplayID directDisplayID = kCGDirectMainDisplay; // TODO
    19. // …
    20. NSError *error = nil;
    21. // …
    22. AVCaptureInput *captureInput = [[[AVCaptureScreenInput alloc] initWithDisplayID:directDisplayID] autorelease ];
    23. if(error != nil)
    24. {
    25. return NO;
    26. }
    27. // …
    28. if(captureInput == nil)
    29. {
    30. return NO;
    31. }
    32. // …
    33. AVCaptureStillImageOutput *captureStillImageOutput = [[[AVCaptureStillImageOutput alloc] init] autorelease];
    34. if(captureStillImageOutput == nil)
    35. {
    36. return NO;
    37. }
    38. // …
    39. AVCaptureSession *captureSession = [[[AVCaptureSession alloc] init] autorelease];
    40. if(captureSession == nil)
    41. {
    42. return NO;
    43. }
    44. // …
    45. [captureSession setSessionPreset:AVCaptureSessionPresetMedium];
    46. [captureSession addInput:captureInput];
    47. // …
    48. AVCaptureVideoPreviewLayer *captureVideoPreviewLayer = [[[AVCaptureVideoPreviewLayer alloc] initWithSession:captureSession] autorelease];
    49. if(captureVideoPreviewLayer == nil)
    50. {
    51. return NO;
    52. }
    53. // …
    54. NSMutableDictionary *mutableDictionary = [NSMutableDictionary dictionary];
    55. [mutableDictionary setObject:AVVideoCodecJPEG
    56. forKey:AVVideoCodecKey];
    57. // …
    58. [captureStillImageOutput setOutputSettings:mutableDictionary];
    59. // …
    60. [captureSession addOutput:captureStillImageOutput];
    61. // …
    62. // TODO > session property
    63. // …
    64. [captureVideoPreviewLayer setFrame:[layer bounds]];
    65. [captureVideoPreviewLayer setAutoresizingMask:(kCALayerWidthSizable | kCALayerHeightSizable)];
    66. [layer addSublayer:captureVideoPreviewLayer];
    67. // …
    68. [captureSession startRunning];
    69. // …
    70. return YES;
    71. // …
    72. }
    Alles anzeigen