Seite 1 von 1

MPlayer, eingebunden in QFrame -> wie Vollbild?

Verfasst: 26. September 2010 00:30
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

Verfasst: 26. September 2010 05:04
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.

Verfasst: 26. September 2010 08:20
von franzf
Warum verwendest du denn nicht gleich phonon? Phonon::VideoWidget wäre wohl das was du suchst. Schau im Assistant nach Doku.

Verfasst: 26. September 2010 16:42
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...?

Verfasst: 26. September 2010 17:37
von kater
Ah Danke. Das mit der Window ID war das Geheimnis.

Verfasst: 26. September 2010 17:55
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 :)

Verfasst: 27. September 2010 09:39
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

Verfasst: 27. September 2010 13:44
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.

Verfasst: 27. September 2010 21:30
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... :)

Verfasst: 28. September 2010 00:39
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

Verfasst: 28. September 2010 01:36
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?

Verfasst: 30. September 2010 01:34
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...

Verfasst: 1. Oktober 2010 18:40
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!! :)