MPlayer, eingebunden in QFrame -> wie Vollbild?
MPlayer, eingebunden in QFrame -> wie Vollbild?
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
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
Das lässt sich eigentlich recht einfach verwirklichen. Der dafür verantwortliche Code ist:
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...?
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);
@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...?
Es kommt halt aufs Backend an. Es gibt irgendwo auch ein mplayer-Backend für phonon
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 ) kannst du in großem Maße bei smplayer spicken, das ist eine qt4-Gui zu mplayer, und der kann auch problemlos vollbild
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 ) kannst du in großem Maße bei smplayer spicken, das ist eine qt4-Gui zu mplayer, und der kann auch problemlos vollbild
-
- Beiträge: 503
- Registriert: 29. Dezember 2006 22:54
- Wohnort: HL
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
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
-
- Beiträge: 79
- Registriert: 11. Oktober 2009 00:37
- Wohnort: Dresden
@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:
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...
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);
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...
-
- Beiträge: 79
- Registriert: 11. Oktober 2009 00:37
- Wohnort: Dresden
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
Ü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
Qt 4.8, OS X Mountain Lion
Also ich kann mal nen ersten Erfolg melden
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:
Habe ich da vielleicht irgendwo einen Fehler drin? Und warum funktioniert es beim zweiten Mal Ausführen des gleichen Codes plötzlich?
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?
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:
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!!
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!!