[gelöst] Player, Control und externer Zuspieler

  • Ich komme nicht mehr weiter. Wahrscheinlich übersehe ich etwas Wesentliches.


    Aktuelle Situation mit den Klassen:

    - MyOSD : cControl.

    - MyPlayer : cPlayer


    Im Hauptmenu öffne ich MyOSD und es funktioniert, wie gewünscht. Nach einer Auswahl im OSD startet ein externer Player, der einen TS-Stream liefert. Ich will dabei das Bestands-OSD als Control weiterverwenden. Das VDR-Plugin macht auf Anforderung folgendes:

    Code
    videoPlayer = new VideoPlayer();
    myOsd->SetPlayer(videoPlayer);
    
    auto c = cDevice::PrimaryDevice();
    cControl::Launch(myOsd);
    cControl::Attach();

    Der externe Zuspieler liefert den TS-Stream, der mittels Player.PlayTS abgespielt wird.


    Jetzt das Problem:

    Das OSD ist da und funktioniert. Allerdings höre ich nur Audio, sehe aber kein Bild.

    Schalte ich das Menu ein und wieder aus, dann habe ich Audio und Video, aber leider nicht mehr das richtige OSD.


    Es scheint, als ob ein Schatten-OSD (ohne Anzeige, ganz schwarz) existiert, daß das Videobild überlagert. Aber dann müssten 2 OSD gleichzeitig dargestellt werden: Meines und das dunkle. Ob das überhaupt möglich ist, weiß ich nicht.


    Im Moment bin ich etwas ratlos.

  • Das ist zum haareraufen. Entweder habe ich das OSD oder ich sehe das Video. Beides zusammen gelingt mir nicht.


    Im cControl gibt es die Möglichkeit mit GetInfo ein OSD Object zurückzugeben, daß auf die Info-Taste der Fernbedienung reagieren soll. Allerdings brauche ich den Key schon im externen Zuspieler.


    Rufe ich testweise bei jedem OSD Update das cControl.Show() auf, dann flackert das Bild und es werden abwechselnd das OSD oder das Video angezeigt. Nah dran an der Wunschlösung, aber absolut unbrauchbar.


    Ist es generell nicht möglich einen cPlayer mit einem permanenten OSD zu betreiben?

  • Welches Ausgabedevice nutzt du?

  • Aktuell ist es softhdcuvid (zum entwickeln). Mein eigentliches Ziel ist aber ein ganz anderes, aber ich bin noch weit davon entfernt es auf dem Zielsystem testen zu können.


    Aktuell lösche ich das OSD (delete), damit das Video dargestellt wird. Das Problem ist nun, es wieder irgendwie zu aktivieren.

    Ich wundere mich nur, warum der Hintergrund schwarz ist, wenn das OSD nicht gelöscht wird und das Video wieder sichtbar, wenn ich das eigene OSD lösche. Es gibt doch keine Default-Pixmap, die schwarz ist und an die ich nicht rankomme, oder? Oder muss die Darstellung des Videos irgendwie im Ausgabedevice "aktiviert" werden?

  • Das Ausgabedevice macht nur das, was VDR ihm vorgibt. Wenn VDR/Plugin sagt, OSD zeichnen und anzeigen, ist das Ausgabedevice dafür verantwortlich, dass das OSD über dem Video dargestellt wird. Wenn VDR sagt, nicht anzeigen oder löschen, sollte auch kein schwarzes OSD kommen. Sobald das Video abgespielt bzw. angezeigt werden soll, sollte es in dem vorgegebenen Videofenster dargestellt werden - könnte aber theoretisch vom OSD überzeichnet werden. Optimalerweise sind Video und OSD komplett voneinander entkoppelt. D.h. es geht jedes einzeln oder auch miteinander.


    Eine Default-Pixmap [0] gibt es glaube ich immer, sobald ein OSD erstellt wird, z.B. für Untertitel. Aber die sollte dann transparent sein, wenn nichts angezeigt wird.


    mit cPlayer und cControl kenne ich mich gar nicht aus. Und auch, was ein cOsdObject ist bzw. wofür man das braucht, weiß ich nicht.


    Hast du mal im mpv plugin gespickt, wie das da gemacht wird, bzw. besser: zillerbaer hat einen mediaplayer in softhddevice-drm eingebaut, der mit cPlayer, cControl und einem OSD arbeitet. Hört sich danach an, als wäre da was dabei für dich...


    Hast du irgendwo deinen Code liegen, den man sich ansehen könnte und evtl. testen? Dann wird mir vielleicht klarer, was du vorhast ;)

    Gruß

    Andreas

  • Hast du mal im mpv plugin gespickt, wie das da gemacht wird, bzw. besser: zillerbaer hat einen mediaplayer in softhddevice-drm eingebaut, der mit cPlayer, cControl und einem OSD arbeitet. Hört sich danach an, als wäre da was dabei für dich...

    Ich habe mir beides angeschaut und es passt leider nicht richtig. Mittlerweile habe ich auch softhddevice ausprobiert und auch hier tritt dasselbe Problem auf. Irgendetwas muss ich also falsch machen.


    Hast du irgendwo deinen Code liegen, den man sich ansehen könnte und evtl. testen? Dann wird mir vielleicht klarer, was du vorhast ;)

    Das hatte ich befürchtet :D Ich arbeite seit Monaten an einer Neuauflage eines alten Plugins von mir und habe nach vielen Irrwegen und Versuchen (Libs, Technologien, ...) etwas gefunden, mit dem ich arbeiten kann und zufrieden bin und auch die Hoffnung habe, es auf CE/LE zum laufen zu bringen.


    Das Gesamtkonstrukt besteht aus 3 Teilen:

    - VDR Plugin (Maschine A)

    - Browser (Maschine A)

    - Transcoder (Irgendwo im Netz oder auf Maschine A, hat idealerweise Zugriff auf einen Hardware-Encoder oder ist schnell genug für software-encoding)


    Das Plugin fordert an, der Browser liefert die Seiten als Images, die per Pixmap in das OSD geschrieben werden. Sollte der Browser ein Video abspielen wollen, wird die URL an den Transcoder gesendet, der das Video lädt, transcodiert (im besten Fall nur die Streams kopiert) und die TS-Packete über den Browser an das Plugin sendet. Das Plugin selber hat nur die Aufgabe den Stream abzuspielen.

    Und hier kommen 2 Ereignisse zusammen: OSD vom Browser + TS Stream vom Transcoder. Jedes einzelne funktioniert einwandfrei im Plugin, aber leider nicht zusammen.


    Ich will mich da nicht unter Druck setzen lassen, zumal ich nicht weiß, ob es irgendwann ein brauchbares Ergebnis gibt und habe das bisher nicht weiter erwähnt.

    Ich könnte die aktuelle Version auf Github bringen (wobei das Repository nicht dauerhaft existieren wird, weil alles noch so unfertig ist und häufig abstürzt und meine Commit-Historie und die Branches ziemlich strubbelig werden; zumindest bis zur ersten brauchbaren Version) oder ich sende dir die Sourcen irgendwie zu. Build-System (Plugin: Makefile, Browser und Transcoder: meson/ninja).


    Mich wundert irgendwie, warum ein Menu-Object funktioniert, aber ein eigenes OSD mittels Pixmaps Probleme macht. Das Menu ist doch eigentlich auch nur ein cOsdObject? Innerhalb des VDR gibt es allerdings eine Unterscheidung zwischen einem Menu und den Control-Object. Ich muss mir das mal näher ansehen und hoffen, etwas zu finden.

  • Das Plugin selber hat nur die Aufgabe den Stream abzuspielen.

    und das OSD anzuzeigen?

    Du kannst ein OSD anlegen und aktiv oder inaktiv schalten. Davon abgängig sollte es angezeigt werden oder nicht...

  • Nu Butter bei die Fische und weg von der Theorie.

    Das ist kein Announcement. Alles ist noch sehr instabil und Bedarf vieler Änderungen. Kein Druck....


    Ich habe die 3 Repositories erstellt:

    GitHub - Zabrimus/vdr-plugin-web
    Contribute to Zabrimus/vdr-plugin-web development by creating an account on GitHub.
    github.com

    GitHub - Zabrimus/remotetranscode
    Contribute to Zabrimus/remotetranscode development by creating an account on GitHub.
    github.com


    GitHub - Zabrimus/cefbrowser
    Contribute to Zabrimus/cefbrowser development by creating an account on GitHub.
    github.com

    Der Browser ist mir schon länger nicht mehr abgestürzt. Der Remotetranscoder fliegt auf jeden Fall auf die Bretter, wenn das Video gestoppt wird und das Plugin (bzw. VDR) auch hin und wieder.


    VDR und Browser gehören auf einen Rechner (das OSD wird per shared memory ausgetauscht). Ich habe eine Menge versucht, daß OSD übers Netz zu bringen, aber da ich einen Alpha-Channel brauche, bin ich bei den Image-Formaten etwas eingeschränkt. Das Encode/Decode habe ich trotz verschiedenster Formate/Libs nicht schnell genug hinbekommen. Bei png z.B. habe ich mit Mühe auf einem schnellen Rechner knapp 25fps geschafft (Encode/Transfer/Decode). Aber da ist schon keine Reserve mehr drin. Weniger fps oder sogar ein noch kleineres Bildformat wollte ich dann doch nicht haben.

    Der Transcoder kann dann irgendwo im Netz sein.


    Sinnvolle Startreihenfolge in 3 Shells:

    1. Transcoder

    2. Browser

    3. VDR


    Und immer wieder alles neu starten, wenn mal was gecrasht ist (und das passiert häufiger). Fehlerbehandlung und Robustheit ist noch ein sehr offenes Thema. Aktuell geht es mir um die Funktionalität.

  • Das OSD und der Videoplayer sind nicht so unabhängig, wie ich immer dachte. Im syslog kann man das schön beobachten

    Solange das OSD auf ist, kommt nur

    Schalte ich das OSD aus (Menu ein), dann ändert sich die Ausgabe sofort und das Video wird sichtbar, aber dafür ist mein OSD nicht mehr da:

    Warum verhindert das offene OSD die Videoausgabe?

  • Zabrimus

    Hat den Titel des Themas von „Player, Control und externer Zuspieler“ zu „[gelöst] Player, Control und externer Zuspieler“ geändert.
  • Das war eine Geisterjagd und enorme Zeitverschwendung :(


    Ich habe nicht mitbekommen, daß die HTML-Seite noch weiter umgeschrieben wird. Ich bin mir auch sicher, daß es nicht immer so war. Auf jeden Fall wird noch irgendwann ein Element mit einem schwarzen Hintergrund eingefügt und der ist für mein Problem verantwortlich. Jetzt muss ich nur noch versuchen, den Hintergrund wieder transparent zu bekommen.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!