PyQt4+Phonon: Video in mehreren Widgets steuern

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Qdeep

Hallo!

Ich möchte mit Phonon ein Video in 2 oder 3 Widgets gleichzeitig steuern können.

(Mein konkretes Ziel ist es, mehrere kleine VideoWidgets zu haben, in denen Videos laufen. Bei einem Klick auf eines davon, soll es dann auch in einem anderen VideoWidget wiedergegeben werden.)

Vielen Dank für eure Vorschläge schon mal!
Gruß, Qdeep
lunar

Du musst eben einen Klick auf das VideoPlayer-Widget abfangen, und dann dessen MediaSource an die anderen VideoPlayer-Widgets übergeben. Ich hoffe, du hast jetzt nicht mehr erwartet …
Qdeep

Dem anderen Widget kann ich keine Referenz auf das alte geben?
Ich möchte nämlich eigentlich, dass das Video genau an der Stelle weiterspielt, wo es im anderen gerade ist/die Widgets synchron halten.
Oder muss ich dann den Umweg gehen, die Seekposition zu übertragen?
lunar

Warum hast du nicht gleich gesagt, dass du die Videos synchron halten willst?

In diesem Fall darfst du kein VideoPlayer-Widget verwenden, sondern musst VideoWidget, AudioOutput und MediaObject manuell verbinden. Dann kannst du – zumindest in der Theorie – die Videoausgabe des MediaObjects mittels CreatePath auf zwei VideoWidgets verteilen. Ich habe dazu mal ein Beispiel erstellt. Zumindest bei mir hat das aber nicht funktioniert, da phonon-xine das Aufteilen des Video-Streams auf zwei Widgets offenbar nicht unterstützt (so lautete zumindest die Fehlermeldung). Ob das mit GStreamer als Backend funktioniert, bleibt auszuprobieren
Qdeep

Also bei mir klappts mit Gstreamer!
Ich probier es jetzt also mit manuellen Paths und melde mich bei weiteren Fragen. Danke schon mal!

OT: Deine connect-Methode für die QActions funktioniert bei mir nicht. self.play|pause|stop|... haben das Attribut triggered nicht.
lunar

Gut zu wissen. Was das Verbinden der Signale angeht: Diese Syntax würde mit PyQt 4.5 eingeführt. Ich habe sie verwendet, weil es so schneller geht (man muss die C++-Signaturen nicht mehr nachschlagen) und schöner aussieht. Das Rückportieren auf Qt 4.4 sollte aber nicht allzu schwer sein, oder?
Qdeep

Das Synchronisieren von zwei VideoWidgets klappt mit lunars Methode schon mal sehr gut.

Würde es auch gehen, wenn ich mehre Quellvideos mit einem einzigen Zielwidget verknüpfe? So, dass beim Klick auf eines der Quellvideos, es sofort im Zielwidget wiedergegeben wird; beim Klick auf ein anderes das nächste usw.?
lunar

Qdeep hat geschrieben:Würde es auch gehen, wenn ich mehre Quellvideos mit einem einzigen Zielwidget verknüpfe? So, dass beim Klick auf eines der Quellvideos, es sofort im Zielwidget wiedergegeben wird; beim Klick auf ein anderes das nächste usw.?
Prinzipiell ja. Du musst eben nur den alten Path lösen, bevor du das VideoWidget mit dem nächsten MediaObject verbindest.
Qdeep

Das habe ich auch gerade probiert. Nur leider hört dann auch das Quellwidget auf zu spielen. D.h. wenn ich ein MediaObject mit 2 Widgets verknüpft habe und abspiele, spielt es in beiden Widgets--wie gewollt. Löse ich jetzt einen Path, stoppt es auch im anderen (noch verbundenen) Widget. Warum?
lunar

Keine Ahnung … Quellcode?
Qdeep

Code: Alles auswählen

#VideoWidgets anlegen
self.widOutput = Phonon.VideoWidget(self)
self.horizontalLayout.addWidget(self.widOutput)

self.widV1 = Phonon.VideoWidget(self)
self.gridLayout.addWidget(self.widV1)

self.widV2 = Phonon.VideoWidget(self)
self.gridLayout.addWidget(self.widV2)

#Paths
self.p1 = None
self.p2 = None

#Quelle1 mit Widget1 verknüpfen
self.mo1 = Phonon.MediaObject(self)
self.vw1 = Phonon.VideoWidget(self.widV1)
self.source1 = Phonon.MediaSource("1.avi")
self.mo1.setCurrentSource(self.source1)
Phonon.createPath(self.mo1, self.vw1)

#Quelle2 mit Widget2 verknüpfen
self.mo2 = Phonon.MediaObject(self)
self.vw2 = Phonon.VideoWidget(self.widV2)
self.source2 = Phonon.MediaSource("2.avi")
self.mo2.setCurrentSource(self.source2)
Phonon.createPath(self.mo2, self.vw2)


#Video1 im Hauptschirm anzeigen
def showV1():
	if self.p2:
		self.p2.disconnect()
	self.p1 = Phonon.createPath(self.mo1, self.widOutput)
	self.mo1.play()


#Video2 im Hauptschirm anzeigen
def showV2():
	if self.p1:
		self.p1.disconnect()
	self.p2 = Phonon.createPath(self.mo2, self.widOutput)
	self.mo2.play()
Der State bleibt übrigens bei 2=Playing. Nur sieht man leider nichts; das Video bleibt stehen.
Antworten