MPlayer, eingebunden in QFrame -> wie Vollbild?

Dein Thema passt einfach in kein Forum? Dann probiers mal hier.
Antworten
listeman
Beiträge: 74
Registriert: 19. Mai 2009 13:54
Kontaktdaten:

MPlayer, eingebunden in QFrame -> wie Vollbild?

Beitrag von listeman »

Hallo Leute,

in einer kleinen Anwendung werden Video-Clips per MPlayer, eingebunden in einen QFrame, angezeigt.

Mein Problem nun ist: Wie kann ich während einer laufenden Wiedergabe in Vollbild schalten?

Da ich MPlayer im slave-Modus starte, habe ich schon versucht, dem Prozess "vo_fullscreen\n" zu übergeben. Dies führt dann jedoch nur zu dem Ergebniss, dass MPlayer den kompletten QFrame ausfüllt (der eine Größe von 400x300 hat), doch nicht den kompletten Bildschirm.
Auch ein ui->frame->showFullScreen() habe ich schon versucht, doch dies bringt keine sichtbare Veränderung.

Irgendwie muss ich also MPlayer sagen, den kompletten Bildschirm auszufüllen - nur wie??

Bin für jede Hilfe dankbar!!

Mit freundlichen Grüßen
listeman
kater
Beiträge: 306
Registriert: 29. Dezember 2009 01:13
Wohnort: Darmstadt

Beitrag von kater »

Habe zwar nicht die Antwort, aber kannst du ein kurzen Code posten wie du das mit mplayer machst? Bin noch nicht mal auf die Idee gekommen, dass sowas überhaupt möglich ist.

Danke.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Warum verwendest du denn nicht gleich phonon? Phonon::VideoWidget wäre wohl das was du suchst. Schau im Assistant nach Doku.
listeman
Beiträge: 74
Registriert: 19. Mai 2009 13:54
Kontaktdaten:

Beitrag von listeman »

@kater

Das lässt sich eigentlich recht einfach verwirklichen. Der dafür verantwortliche Code ist:

Code: Alles auswählen

QStringList args;

	WId winid = ui->mpl->winId();
	long windowId = long(winid);

	args << "-wid" << QString("%1").arg(windowId) << "-idle" << "-slave" << "-really-quiet";

	mplayer->start("mplayer",args);
Damit zeigt der MPlayer-Prozess names "mplayer" alle Videoausgabe in dem QFrame namens "mpl" an. Per write() können dann ganz einfach beliebige Dateien geladen werden.

@franzf
Habe mir natürlich auch schon überlegt, evtl. Phonon zu nehmen. Doch die zwei Hauptgründe warum ich mich dann doch dagegen entschieden habe sind:
1. Die offizielle Beschreibung von Phonon: "Qt uses the Phonon multimedia framework to provide functionality for playback of the most common multimedia formats"
MPlayer kann nicht nur mit den meisten der gängigen Multimediaformate umgehen, sondern mit so ziemlich allem, was du ihm zu schlucken gibts.

2. Habe viel widersprüchliches über die Zukunft von Phonon gelesen. Manche sagen, dass es bleiben wird. Andere sagen, dass es recht bald (z.B. in Qt 5) wieder verschwunden sein wird. Wieder andere sagen, dass noch niemand etwas über die Zukunft von Phonon weiß - und alle behaupten, es ganz sicher zu wissen.
Naja, wenn ich es erst gar nicht benutze, muss ich mir darum auch keine Gedanken machen...

Dies sind die beiden Hauptgründe, warum ich mich gegen Phonon entschieden habe (vor allem der erstere, der zweitere ist eigentlich eher nebensächlich)... Doch ich lasse mich auch noch gerne umstimmen :-)
Zumindest nach der offiziellen Beschreibung muss ich annehmen, dass Phonon doch einige Beschränkungen habe. Vielleicht ist diese Beschreibung auch etwas irre führend...?
kater
Beiträge: 306
Registriert: 29. Dezember 2009 01:13
Wohnort: Darmstadt

Beitrag von kater »

Ah Danke. Das mit der Window ID war das Geheimnis.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Es kommt halt aufs Backend an. Es gibt irgendwo auch ein mplayer-Backend für phonon :P
Und dass phonon schon tot ist ist ja wohl ein Witz. Evtl. kann da nur gemeint gewesen sein, dass es kein Qt-Modul mehr ist. Aber kde4 setzt voll auf phonon (ist ja eine kde-Entwicklung), und dieses "kde-phonon" wird es 100%ig auch noch mit >=Qt5 geben.
Oder hast du nur die Flames von pulseaudio gelesen? Die wollten ja durchdrücken, dass alle Linuxwelt das Tolle pulseaudio verwendet, und phonon ist wieder eine Sackgasse wie arts usw. Naja, egal, vllt. kannst du ja ein paar Links nachlegen.

Ich fahre hier kde+phonon+xine-backend, und kann ALLES abspielen! Wenn nicht alles geht sollte man sich bei der Distribution beschweren.

Wenn du trotzdem noch den mplayer-Weg gehen willst (ist ja legitim :P) kannst du in großem Maße bei smplayer spicken, das ist eine qt4-Gui zu mplayer, und der kann auch problemlos vollbild :)
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Beitrag von -=Freaky=- »

listeman:
ich habe das mit dem einbetten jetzt noch nie gemacht, aber du sagst, wenn du mplayer "fullscreen" setzt, fuellt er das ganze widget (QFrame?) aus?
dann koenntest du ja vllt. zusaetzlich dein QFrame fullscreen machen (http://doc.trolltech.com/4.6/qwidget.ht ... indowState mit Qt::WindowFullScreen)?
... nur eine idee dazu. wie gesagt, ich hab keine ahnung, ob das funktioniert. kann man aber vllt. probieren.

mfg
julian
Herzogswalder
Beiträge: 79
Registriert: 11. Oktober 2009 00:37
Wohnort: Dresden

Beitrag von Herzogswalder »

Mach doch eine Ableitung von QFrame und überschreibe das resizeEvent.
Dort kannst du dann ja auf Größenänderungen des QFrame's entsprechend reagieren.
Gruß, Herzogswalder
Qt 4.8, OS X Mountain Lion
listeman
Beiträge: 74
Registriert: 19. Mai 2009 13:54
Kontaktdaten:

Beitrag von listeman »

@franzf
Also ich hab mal versuchsweise anstatt MPlayer den Videoplayer von Phonon eingebaut - hatte jedoch genau dieselben Probleme. Damit er den QFrame ersetzt, musste ich ihm den Frame als parent geben. Ein Umschalten in Vollbild füllte dann ebenfalls nur den QFrame aus.
Also ich glaube, dass ich wohl doch bei MPlayer bleibe, gibt dann immerhin ein paar weniger Abhängigkeiten :)

@-=Freaky=-
Hm, das habe ich mir auch schon gedacht und ausprobiert, jedoch bringt ein ui->QFrame->setWindowState(Qt::WindowFullScreen); überhaupt keine (sichtbare) Änderung.
Würde mal behaupten (habs nicht ausprobiert), dass das wohl nur beim centralWidget() ne Wirkung hat...?

@Herzogswalder
Mein Problem war weniger eine Größenänderung abzufangen, sondern überhaupt erst mal eine Größenänderung (nämlich Vollbild) fertigzubekommen... oder vielleicht hab ich dich auch falsch verstanden?



Habe folgenden Versuch unternommen mit immerhin halbem Erfolg:

Code: Alles auswählen

this->setWindowState(Qt::WindowFullScreen);
ui->video->setGeometry(0,0,this->width(),this->height());
QByteArray x("vo_fullscreen");
mplayer->write(x);
Dies ganze wird nach Klick auf einen QPushButton ausgeführt. Jedoch muss ich den immer zweimal klicken. Das erste Mal wird nur das gesamte Programm in Vollbild geschaltet. Erst beim zweiten Mal wird dann auch MPlayer, bzw. der dazugehörige QFrame in der Größe geändert. Dies gibt für mich einfach keinen Sinn...?
Zudem wird MPlayer dann zwar im Vollbild angezeigt, jedoch stimmen die Proportionen dann nicht mehr. Auf meinem Laptop mit 16:9 Bildschirm füllt er dann zwar alles aus, dies jedoch auch, wenn das eigentliche Video ein Seitenverhältnis von 4:3 hat, zieht es also etwas in die Breite (gibt es dafür evtl. eine MPlayer-Eigenschaft, die das erledigt? Werde selbst auch noch mal nachschauen...)


Der halbe Erfolg: Er schaltet schlussendlich zwar in Vollbild, doch zwei Probleme bleiben noch bestehen... wäre echt super, wenn jemand ne Idee hätte, denn ich bin mit meinem Latein da am Ende... :)
Herzogswalder
Beiträge: 79
Registriert: 11. Oktober 2009 00:37
Wohnort: Dresden

Beitrag von Herzogswalder »

Ich hab dich falsch verstanden.
Überschreibe das changeEvent, dort prüfst du dann, ob event->type() == QEvent::WindowStateChange ist,
prüfst dann den aktuellen windowState() vom Fenster und informierst entsprechend mplayer.

http://doc.trolltech.com/4.6/qwidget.html#changeEvent
Gruß, Herzogswalder
Qt 4.8, OS X Mountain Lion
listeman
Beiträge: 74
Registriert: 19. Mai 2009 13:54
Kontaktdaten:

Beitrag von listeman »

Also ich kann mal nen ersten Erfolg melden :D

Da mplayer ja beim schalten in den Vollbildmodus nur den kompletten QFrame ausfüllt, habe ich die komplette MPlayer-Instanz im Vollbildmodus gestartet ("-fs -noborder") und ändere danach nur die Größe des QFrames. Das funktioniert auch insoweit super, dass MPlayer jetzt auch das Seitenverhältnis beibehält.

Jedoch bleibt noch das Problem, dass ich immer zweimal den Button klicken muss:

Beim ersten Mal schaltet er nur das Anwendungsfenster in den Vollbildmodus, erst beim zweiten Mal passt er dann auch das QFrame an. Dies ist der Code, der dabei ausgeführt wird:

Code: Alles auswählen

int desk_width = QApplication::desktop()->screenGeometry(this).width();
int desk_height = QApplication::desktop()->screenGeometry(this).height();
ui->statusbar->hide();
this->showFullScreen();
ui->video->setGeometry(0,0,desk_width,desk_height);

Habe ich da vielleicht irgendwo einen Fehler drin? Und warum funktioniert es beim zweiten Mal Ausführen des gleichen Codes plötzlich?
listeman
Beiträge: 74
Registriert: 19. Mai 2009 13:54
Kontaktdaten:

Beitrag von listeman »

Sobald ich ein wenig mehr Zeit finde (hoffentlich morgen Nachmittag) werde ich etwas mehr Code posten. Irgendwo muss da ja nen wenn auch nur kleiner Fehler sein...
listeman
Beiträge: 74
Registriert: 19. Mai 2009 13:54
Kontaktdaten:

Beitrag von listeman »

Okay, ich habe es jetzt mit einem kleinen Trick (einem Timer) gelöst. Doch das ist etwas geschummelt, also wenn jemand eine richtige Lösung hat, dann wäre ich dafür wirklich sehr dankbar :)

Also hier mal der Ausschnitt aus meinem Code:

Code: Alles auswählen

	connect(ui->fullscreen, SIGNAL(clicked()), this, SLOT(fullscreen_1()));
	connect(timer,SIGNAL(timeout()), this, SLOT(fullscreen_2()));

...

void MainWindow::fullscreen_1() {

	ui->statusbar->hide();
	ui->infos->hide();

	mpl_x = ui->video->geometry().x();
	mpl_y = ui->video->geometry().y();
	mpl_w = ui->video->geometry().width();
	mpl_h = ui->video->geometry().height();
	if(this->isMaximized()) {
		normal_max = 1;
	} else {
		normal_max = 0;
	}
	this->showFullScreen();
	timer->start(250);

}


void MainWindow::fullscreen_2() {

	int desk_width = QApplication::desktop()->screenGeometry(this).width();
	int desk_height = QApplication::desktop()->screenGeometry(this).height();

	ui->video->setGeometry(0,0,desk_width,desk_height);
	timer->stop();

}

Mit einer Verzögerung von 0.25 Sekunden wird die zweite Funktion aufgerufen, die die Größe des QFrames an Desktopgröße anpasst. Die mpl_* Variablen speichern die vorherige Position des Frames um ihn beim Verlassen des Vollbildes wieder herzustellen.

Ja, wie gesagt, das funktioniert zwar, jedoch ist dies auch keine optimale Lösung... wenn jemand ne Idee zu ner besseren Lösung hat, dann wäre ich echt dankbar darüber!! :)
Antworten