Omxplayer mit python-wrapper klappt nicht

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hi folks,
    ich wollte einen "lebenden Bilderrahmen" basteln. Der sollte auf einem Zero W verschiedene MP4-Videos unterbrechnungsfrei per HDMI abspielen die auf Ereignisse wie Näherungssensor reagieren.
    Dazu hab ich mit omxplayer losgelegt. Der spielt aber die Videos nicht unterbrechnungsfrei. Auch spielt er die Videos nur, wenn ich --no-osd angebe, ansonsten kommt nur ein grüner Schirm mit Sound. Dann hab ich den Python-Wrapper von https://github.com/willprice/python-omxplayer-wrapper installiert. Der soll den Player via dbus steuern. Natürlich habe ich python-dbus installiert.
    Da klappt aber gar nix. Wenn ich einen einfachen Test wie in der Anleitung beschrieben starte gibt es gar keine Ausgabe, das Script läuft 5 Sekunden und beendet sich ohne Fehlermeldung.
    Auch habe ichdas ganze auf einem normalem Dreier mit frischem Raspian probiert, das selbe Problem.

    Hat jemand eine Idee oder Tip was ich falsch mache oder was ich sonst machen könnte?

    Danke schonmal

    • Offizieller Beitrag
    Zitat

    normalem Dreier

    Heisst das nicht "flotter"? :denker: Wenn du schon ein script erwähnst, solltest du es auch posten (in code tags)

    Der Unterschied zwischen Genie und Wahnsinn definiert sich im Erfolg.

    Einmal editiert, zuletzt von dbv (28. Juni 2017 um 17:24)

  • Hier dann man das Testscript. Es läuft ohne Fehler aber auch ohne Ausgabe.Und der Dreier ist tatsächlich ein Flotter, besonders gegenüber meinem Einer :)

  • Hallo rasp-baer,

    In Deinem Python-Codefragment steht ja klipp und klar drin, was passiert:

    Code
    file_path_or_url = 'g.mp4'
    # [...]
    player.play()
    sleep(5)
    player.pause()

    Die Videodatei g.mp4 wird geladen, zum Abspielen gestartet und nach 5 Sekunden auf Pause gesetzt.

    Da Du offenbar auf dem Display nichts siehst, gibt es mehrere Fehlerquellen:
    Hardware:
    Funktioniert Dein verwendetes Display (problemlos)? Ich habe da aufgrund Deiner Beschreibung so meine Zweifel... Verwende ggf. als Quercheck einen "normalen" HDMI-Fernseher.

    Software:
    - Ist die Datei g.mp4 vorhanden? Bitte den kompletten absoluten Pfad im Python-Script angeben!
    - Ist das Videomaterial in g.mp4 "schön bunt und schnell" oder ist es ein dunkles, langsames Video? Dann kann man nämlich auch irrtümlich meinen, es würde nichts dargestellt werden, weil es nicht auffällt... Da reicht es, wenn das Video erst nach 6 Sekunden richtig beginnt und vorher ein schwarzes Bild enthält.

    Hinweis:
    Bei meinem >> YaMuPlay << habe ich auch mit der dbus-Anbindung von omxplayer.bin experimentiert. Ich habe es damals für Raspbian wheezy erstellt. Unter Raspbian jessie ist leider der Mountpfad von USB-Sticks anders, deshalb funkioniert es mit jessie nicht gescheit. Muss ich mal anpassen...

    EDIT 03.10.2018: mittlerweile geschehen, es gibt Version 0.3.2

  • Ich hab einen HDMI-Fernseher dran. omxplayer mit der Datei auf der Konsole klappt wie geschrieben ja ohne Probleme, abgesehen von der --no-osd Geschichte. Bin aber etwas weiter. Scheint irgendwie ein Rechteproblem zu sein. Aber auch jetzt habe ich das Problem dass ich zwischen zwei Videos nicht lückenlos umschalten kann.
    Nochmal zum Verständnis. Es soll ein Halloween-Gimmick werden. So Im Stile der lebendigen Bilder bei Harry Potter nur in gruselig. Ich habe drei Videos. Das erste Video ist im Prinzip nur ein Standbild was in einer Endlosschleife laufen soll und per Geräusche Leute zum Bild locken soll. Das zweite und dritte Video soll dann per Zufall abgespielt werden wenn jemand den Näherungssensor auslöst. Aber das Ganze halt ohne Aussetzer beim Wechsel. Die einzelnen Videos sind zwischen 15MB und 50MB gross.

    Im Moment probier ich mit folgendem Code:

    player = OMXPlayer('g1.mp4',['--no-osd'])
    player.play()
    sleep(15)
    player.quit()

    Hier schaltet der Player kurz auf Konsole und dauert kurz bevor das zweite startet, schlecht.

    player = OMXPlayer('g2.mp4',['--no-osd'])
    player.play()
    sleep(15)
    player.quit()

    Mehrere Instanzen im Stile von
    player1 = OMXPlayer('g1.mp4',['--no-osd'])
    player2 = OMXPlayer('g2.mp4',['--no-osd'])
    player1.play()
    ....

    funktioniert nicht.



    Hinweis:
    Bei meinem >> YaMuPlay << habe ich auch mit der dbus-Anbindung von omxplayer.bin experimentiert. Ich habe es damals für Raspbian wheezy erstellt. Unter Raspbian jessie ist leider der Mountpfad von USB-Sticks anders, deshalb funkioniert es mit jessie nicht gescheit. Muss ich mal anpassen...

    Hab ich die Tage auch schon bemerkt :) .
    Aber ich kämpfe mich mal zu der Ansteuerung durch, Vielleicht hilft mir das ja.
    Bin auch für andere Vorschläge dankbar.

  • Hallo rasp-baer,

    Die Pausen rühren vermutlich von der Neuinitialisierung des omxplayers mit einer neuen Videodatei her. Möglicherweise ist es geschickter, ein einzelnes Gesamtvideo mit allen Teilen zu erstellen, in dem die gewünschten Stellen bei Bedarf (Näherungsschalter spricht an) angesprungen werden.


    Ich habe drei Videos. Das erste Video ist im Prinzip nur ein Standbild was in einer Endlosschleife laufen soll und per Geräusche Leute zum Bild locken soll. Das zweite und dritte Video soll dann per Zufall abgespielt werden wenn jemand den Näherungssensor auslöst. Aber das Ganze halt ohne Aussetzer beim Wechsel.


    Versuche doch mal, Deine Teilvideos mit einem Videobearbeitungsprogramm in eine einzige Videodatei zu packen:
    Das neue Gesamtvideo startet mit einem der beiden Videos, das beim Auslösen des Näherungssensors abgespielt werden soll. Dann folgt (im Idealfall mit einer sauberen Überblendung) das Standbild mit den Geräuschen. Das Standbild kann man je nach Länge ggf. mehrmals hintereinander in das neue Gesamtvideo flicken. Die Dateigröße spielt ja heutzutage nicht mal mehr auf dem RPi eine wirkliche Rolle.

    Beim Start Deines "Horror-RPi"-Scriptes kannst Du mit einer Anweisung wie

    Code
    player.set_position(5) # Startposition des Standbildes im Gesamtvideo (z.B. bei 5 Sekunden)
    player.play()


    zunächst auf den Beginn des Standbildes springen und mit dem Abspielen beginnen

    Wenn jetzt der Näherungsschalter anspricht, setzt Du die Position mit

    Code
    player.set_position(0) # Startposition des "Gruselvideos"


    und lässt das Ganze einfach durchlaufen. Für einen sauberen Übergang ins Standbild hast Du ja eine vernünftige Überblendung eingefügt ;)
    Ich weiß jetzt nur nicht, ob .set_position(tim) im omxplayer.bin schnell genug und ruckelfrei arbeitet. :huh:

    Wenn das wie gewünscht funktioniert, kannst Du ja bei Position 2 Minuten(?) das zweite Gruselvideo ins Gesamtvideo einfügen, ebenfalls gefolgt von einer sauberen Überblendung auf das Standbild bis zur Position 4 Minuten, also mit gleicher Gesamtlänge! Weitere denkbare Gruselschocker können dann bei 4, 6, 8, ... Minuten ins Gesamtvideo eingefügt werden.
    Im Python-Script baust Du dann etwas in dieser Art ein:

    Code
    # Die Variable gruselindex enthält den nullbasierenden Index Deines gewünschten Gruselbildes
    # Die Variable (oder Funktion) naeherung enthält 1, wenn der Näherungsschalter angesprochen hat, sonst 0
    player.set_position(gruselindex * 120) # Gesamtlänge Gruselvideo+Standbild: 120 Sekunden
    while naeherung == 0:
        while player.get_position() < (gruselindex + 1) * 120 and naeherung == 0:
            sleep(0.2)
        player.set_position(gruselindex * 120 + 7) # Position im Standbild, das sich gut mit dem Ende überschneiden lässt (am besten jeweils eine kurze tonlose Passage)
    # An dieser Programmstelle wurden die while-Schleifen verlassen. Der Näherungsschalter hat also angesprochen!
    naeherung = 0 # rücksetzen


    In diesem Codefragment setzt das Programm die Videoposition auf das festgelegte Gruselbild, spielt es ab und wechselt in das Standbild. Wenn sich zwei Minuten niemend nähert, springt es wieder an den Anfang des Standbildes (bei 7 Sekunden nach der Überblendung)
    Wenn sich jemand nähert, wird die geschachtelte Schleife verlassen.

    Ein vom Näherungsschalter ausgelöster Interrupt setzt in seinem Handler per Zufallsgenerator einen neuen gruselindex und ruft obige Routine erneut auf.

    Das ist jetzt nur mal so eine Idee von mir, ich habe es nicht getestet! Aber vielleicht kommst Du ja auf diese Art weiter...


    Die einzelnen Videos sind zwischen 15MB und 50MB gross.


    Ich kenne die Auflösung Deiner Videos nicht, aber selbst am RPi1 (700MHz) oder RPi0 (sogar etwas schneller als RPi1: 1GHz) laufen bei Verwendung von omxplayer.bin mit seiner Hardwarebeschleunigung sogar Full-HD-Videos prinzipiell ruckelfrei.

    schlizbäda


  • Hallo rasp-baer,

    Die Pausen rühren vermutlich von der Neuinitialisierung des omxplayers mit einer neuen Videodatei her. Möglicherweise ist es geschickter, ein einzelnes Gesamtvideo mit allen Teilen zu erstellen, in dem die gewünschten Stellen bei Bedarf (Näherungsschalter spricht an) angesprungen werden.

    Das ist die Lösung, danke. Jetzt klappt es so wie es soll. Jetzt noch etwas Feinschliff am Script aber es läuft schonmal. Hier meine Version.

    Jetzt kann Halloween kommen. Nur noch einen schön alten Bilderrahmen um den Fernseher und an die Wand gehängt. Muahahaha

    Danke nochmal schlizbäda

    Die Videos sind übrigens Full_HD-Videos vom AtmosFx.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!