omxplayer wrapper alsa (hifiberry) Soundausgabe

  • Hallo,

    ich möchte mit Hilfe von Omxplayer Wrapper LiveStreams von meinem VU+ Linux Sat Receiver ansehen (Raspberry Pi mit original 7 Zoll Touch und HifiBerry AMP+).

    Der Befehl für die Kommandozeile lautet: omxplayer -o alsa link-sat-receiver

    Dies funktioniert auch super. Mit weiteren Optionen kann ich auch das Bild scallieren und an die gewünschte Position auf dem Bildschirm legen.

    Mein Problem ist, dass Soundausgabe via Python3 und omxplayer wrapper nicht auf den HifiBerry/ALSA bekomme.

    Es erscheint folgende Fehlermeldung:

    Traceback (most recent call last):
    File "/home/pi/python/omx-wrapper-test-01.py", line 6, in <module>
    player = OMXPlayer(file_path_or_url, args=['-o alsa'])
    File "/usr/local/lib/python3.5/dist-packages/omxplayer_wrapperhttp://-0.2.3-py3.5.egg/omxplayer/player.py", line 82, in __init__
    self.load(source, pause=pause)
    File "/usr/local/lib/python3.5/dist-packages/omxplayer_wrapperhttp://-0.2.3-py3.5.egg/omxplayer/player.py", line 166, in load
    self._load_source(source)
    File "/usr/local/lib/python3.5/dist-packages/omxplayer_wrapperhttp://-0.2.3-py3.5.egg/omxplayer/player.py", line 89, in _load_source
    self._connection = self._setup_dbus_connection(self._Connection, self._bus_address_finder)
    File "/usr/local/lib/python3.5/dist-packages/omxplayer_wrapperhttp://-0.2.3-py3.5.egg/omxplayer/player.py", line 138, in _setup_dbus_connection
    raise SystemError('DBus cannot connect to the OMXPlayer process')
    SystemError: DBus cannot connect to the OMXPlayer process+

    Kann mir jemand einen Tipp geben, was ich falsch mache ?

    Danke und schönes Wochenende

  • Hallo LupusLupus,

    Der folgende Aufruf ist falsch:

    Code
    player = OMXPlayer(file_path_or_url, args=['-o alsa'])

    Probiere stattdessen mal

    Code
    player = OMXPlayer(file_path_or_url, args=['-o', ' alsa'])


    args ist vom Python-Datentyp Liste. Diese Liste besteht hier aus Elementen vom Datentyp string und muss aus zwei Elementen bestehen.

    Dein Aufruf führt zum Shellaufruf-Äquivalent

    Code
    omxplayer "-o alsa" # ein Kommandozeilenparameter mit Leerzeichen


    meiner zu dem, was der omxplayer tatsächlich erwartet, nämlich

    Code
    omxplayer "-o" "alsa" # Zwei durch Leerzeichen getrennte Kommandozeilenparameter

    In meinem >> Python3-Script für den omxplayer << kommt folgende Zeile vor:

    Code
    self.gl_omxplayer = OMXPlayer(file, ['--alpha', str(alpha), '--aspect-mode', self.gl_aspectMode])


    Dieser Aufruf funktioniert einwandfrei.

    PS:
    Danke für den Hinweis mit den Kommandozeilenparametern -o alsa. Das muss ich morgen gleich ausprobieren. Zumindest in den alten Versionen von omxplayer.bin konnte man bei -o nur HDMI oder analog wählen (die genaue Syntax weiß ich gerade nicht), aber alsa funktioniert(e) nicht. Scheint aber laut Deiner Tests jetzt zu funktionieren :thumbs1:
    (wäre ja drexgeil!)

    schlizbaeda

  • Hallo schlizbäda,

    vielen Dank für Deine Antwort. Dein Script für den "Umzugswagen-Soundplayer" hatte ich auch schon im Internet entdeckt und war der Meinung, dass ich sowas auch für mein Projekt auch gut gebrauchen kann.

    Dein vorgeschlagener Aufruf

    Code
    player = OMXPlayer(file_path_or_url, args=['-o', ' alsa'])

    hat leider auch nicht funktioniert, es kam folgende Fehlermeldung:

    >>> %Run omx-wrapper-test-01.py
    Traceback (most recent call last):
    File "/home/pi/python/omx-wrapper-test-01.py", line 6, in <module>
    player = OMXPlayer(file_path_or_url, args=['-o', ' alsa'])
    File "/usr/local/lib/python3.5/dist-packages/omxplayer_wrapperhttp://-0.2.3-py3.5.egg/omxplayer/player.py", line 82, in __init__
    self.load(source, pause=pause)
    File "/usr/local/lib/python3.5/dist-packages/omxplayer_wrapperhttp://-0.2.3-py3.5.egg/omxplayer/player.py", line 166, in load
    self._load_source(source)
    File "/usr/local/lib/python3.5/dist-packages/omxplayer_wrapperhttp://-0.2.3-py3.5.egg/omxplayer/player.py", line 89, in _load_source
    self._connection = self._setup_dbus_connection(self._Connection, self._bus_address_finder)
    File "/usr/local/lib/python3.5/dist-packages/omxplayer_wrapperhttp://-0.2.3-py3.5.egg/omxplayer/player.py", line 138, in _setup_dbus_connection
    raise SystemError('DBus cannot connect to the OMXPlayer process')
    SystemError: DBus cannot connect to the OMXPlayer process


    Die Info mit dem ALSA Support beim OMXPlayer habe ich von hier: https://github.com/popcornmix/omxplayer/issues/442 letzter Eintrag, vielleicht hilft uns das etwas weiter.

    Folgende Audio Output Optionen sind jetzt im OMXPlayer möglich: argument for -o: Output device must be `local', `hdmi', `both' or `alsa'

    Schaut man in das Manual vom OMPlayer:

    Code
    man omxplayer

    so steht da bei Option -o folgendes:

    -o --adev device Audio out device : e.g. hdmi/local/both/alsa[:device]

    Wenn ich in der Kommandozeile "aplay -l" eingebe erhalte ich folgende Ausgabe:

    **** Liste der Hardware-Geräte (PLAYBACK) ****
    Karte 0: sndrpihifiberry [snd_rpi_hifiberry_amp], Gerät 0: HifiBerry AMP HiFi tas5713-hifi-0 []
    Sub-Geräte: 1/1
    Sub-Gerät #0: subdevice #0

    Also muss man vielleicht noch das Geräte/Device in meinem Fall "0" mit angeben, was bei mir aber auch wieder zu einer Fehlermeldung in der Kommandozeile kommt bzw. vielleicht mache ich den Aufruf auch falsch.

    Fällt Dir/Euch noch was ein ?

  • Zitat von &quot;LupusLupus&quot; pid='296085' dateline='1503209532'


    Dein vorgeschlagener Aufruf

    Code
    player = OMXPlayer(file_path_or_url, args=['-o', ' alsa'])

    hat leider auch nicht funktioniert, es kam folgende Fehlermeldung: ...


    Mein Fehler! :blush:
    Es muss

    Code
    player = OMXPlayer(file_path_or_url, args=['-o', 'alsa'])


    lauten, also ohne dem Leerzeichen nach dem ersten Anführungszeichen bei 'alsa'! Resultiert letztlich (wie immer) aus der Schlamperei bei Verwendung von Copy-Paste :baeh2:


    Zitat von &quot;LupusLupus&quot; pid='296085' dateline='1503209532'


    Schaut man in das Manual vom OMPlayer: man omxplayer
    so steht da bei Option -o folgendes:

    -o --adev device Audio out device : e.g. hdmi/local/both/alsa[:device]


    ...und in der Zeile drüber steht
    -n --aidx index Audio stream index : e.g. 1

    Zitat von &quot;LupusLupus&quot; pid='296085' dateline='1503209532'


    Also muss man vielleicht noch das Geräte/Device in meinem Fall "0" mit angeben, was bei mir aber auch wieder zu einer Fehlermeldung in der Kommandozeile kommt bzw. vielleicht mache ich den Aufruf auch falsch.


    Probiere doch mal folgende Variante:

    Code
    player = OMXPlayer(file_path_or_url, args=['-o', 'alsa', '-n', '0'])


    oder vielleicht auch mit 1 als ALSA-Audioindex?

    Ich bin mir sicher, dass wir das noch hinbekommen werden :)

    schlizbäda

  • Hallo,

    also der Fehler lag, wie schon richtig geahnt an dem zu vielem Leerzeichen (Danke für den Tipp), nachdem ich:

    Code
    player = OMXPlayer(file_path_or_url, args=['-o', 'alsa'])


    verwendet habe ging die Soundausgabe auch über den HifiBerry.

    Was mir noch aufgefallen ist, wenn ich einen Stream vom Sat Receiver mir anschaue, dann kommt es zu Soundproblemen während der Werbung.
    Wahrscheinlich liegt es daran, dass zwischen 5.1 und Stereo umgeschalten wird. Kann man dem OMXPlayer sagen, dass er "nur" den Stereo Streamanteil nimmt, da ich bei meinem Projekt nur 2 Lautsprecher habe ?

  • Zitat von &quot;LupusLupus&quot; pid='296135' dateline='1503232447'


    Was mir noch aufgefallen ist, wenn ich einen Stream vom Sat Receiver mir anschaue, dann kommt es zu Soundproblemen während der Werbung.


    Das ist doch gut, sozusagen ein Alarm für die Toilette :thumbs1:
    Andere stecken in so etwas einen Haufen Programmierenergie und schaffen es dann doch nicht :D
    ...und beim Aufzeichnen von Sendungen kann ein Aufnahmegerät während der Werbung automatisch auf Pause gehen :bravo2:
    TOP!

    PS:
    An Deinem Python-Script hätte ich durchaus Interesse. Stellst Du es auch irgendwann/demnächst auf github oder so?

    Gruß schlizbäda

  • Das mit dem Soundproblem muss ich mir mal in Ruhe ansehen.

    Was jetzt noch ist:

    Wenn ich ein Video/Stream starte, dann wird es schon in dem vorgegebenen Bereich dargestellt.
    Danach stoppe ich es, warte kurz und starte den Stream erneut, was zur Folge hat, dass das Video über den kompletten Bildschirm dargestellt wird und nicht in dem Bereich wie vorgegeben ?!

    Woran liegt das ?

  • Hallo LupusLupus,

    in den Methoden def VideoPlay(self): und def VideoStop(self): legst Du bei jedem Aufruf eine neue Instanz von OMXplayer an, die Du in der lokalen Variable player abspeicherst. Eigentlich sollte ja schon der Button [Stop] nicht funktionieren, da Du eine neue Instanz anlegst und diese stoppst und nicht die Instanz, die Du mit dem Button [Play] gestartet hast! Vermutlich funktioniert [Stop] nur deswegen, weil die vom Wrapper mit player.set_video_pos(2,66,802,517) gesendeten dBus-Befehle irgendwie trotzdem an die erste Instanz gesendet werden.

    Beim Neustart mit [Play] wird die dritte Instanz erstellt, die standardmäßig auf Vollbild voreingestellt ist! Der Wrapper sendet mit player.set_video_pos(2,66,802,517) aber vermutlich wieder an die erste Instanz und deshalb beißt die gewünschte Videogröße bei der dritten Instanz nicht an!

    Also:
    Mache es wie ich:
    Definiere in Deiner Klasse eine globale Membervariable self.gl_player, greife darauf in allen Methoden zu und überprüfe immer, ob Du den omxplayer wirklich neu starten musst. Ansatzweise geht das so:



    Schau ansonsten nochmals in mein Script (Link in Signatur) und lade es neu von github herunter. Ich habe es vor wenigen Tagen aktualisiert. Dort heißt die Membervariable jedoch self.gl_omxplayer
    Automatisch zusammengefügt:
    Ich weiß nicht, wie oft sich die Mediadatei ändert, aber bei Deinem Stream bleibt die vermutlich immer gleich. Wenn dem so ist,
    reicht es, eine omxplayer-Instanz gleich zu Beginn im Konstruktor def __init__(self, ...): anzulegen und in def run(self): hinter dem mainloop-Aufruf den omxplayer sauber zu beenden und die Instanz zu löschen (die drei Befehle von der Stop-Routine).

  • Hallo schlizbäda,

    vielen Dank für Deine Antwort und sorry für die späte Rückmeldung von mir.
    Manchmal kommt man einfach nicht zu dem was man sich vorgenommen hat.

    Ich habe Deine Scriptvorschläge ausprobiert und es funktioniert super.
    Leider ist bei mir die Zeit im Moment etwas knapp.
    Sobald ich weiter mache (und wieder stolpere :lol:) werde ich mich auf alle Fälle wieder hier melden.

Jetzt mitmachen!

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