PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : mpg-preview in QT/KDE



celindir
28-02-2003, 11:49
Hallo zusammen,

so ist das, wenn eine Programmierneuling was eigenes zustande bringen will:

Er hat ne Menge Fragen ;)

Ich arbeite mit KDevelop und QTDesigner und möchte in einem Programm mit mpg-videos arbeiten.

In einem TreeView können einer oder mehrere Verweise zu mpg.Dateien angegeben werden.

Ich möchte nun, dass der Nutzer, wenn er einen Eintrag auswählt in einem Vorschaufenster das Video betrachten kann.
Die Vorschau sollte auch die wichtigsten Schaltflächen für die Steuerung enthalten (vorspulen, zurückspulen, pause, play, stopp und am besten noch einen slider)
Ferner brauche einen Rückgabewert der aktuellen Position im Film.

Hat irgend jemand verstanden, was ich meine ???:(

Gibt es für soetwas fertige Widgets unter QT/KDE ?
Hat jemand Erfahrungen mit soetwas?
geht das überhaupt?

Wenn jemand Ideen hat oder in einem anderen Programm schon soetwas ähnliches gesehen hat, bin ich für sachdeinliche Hinweise sehr dankbar.

Vielleicht findet sich ja auch jemand, der soetwas programmiern kann und sich an meinem Projekt beteiligen möchte.

Also, vielen Dank fürs Kopfzerbrechen

anda_skoa
28-02-2003, 18:07
Hmm, das gibt es schon, ist aber keine triviale Sachen.

Da wäre der KMediaPlayer: http://developer.kde.org/documentation/library/3.1-api/classref/interfaces/KMediaPlayer__Player.html
Das ist ein Interface, das zB von Kaboodle implementiert ist.

Man kann also einen KMediaPlayer mittels KPart Framework laden und einbinden.
Du musst den KTrader nach einem Service für den ServiceTyp KMediaPlayer/Player fragen.

Über KParts gibts hier leider noch nicht viele Beiträge.

Ciao,
_

axeljaeger
28-02-2003, 18:51
Kriegt man das überhaupt einigermaßen schnell hin? Müsste man da nicht SDL einbetten?

anda_skoa
28-02-2003, 20:15
Original geschrieben von axeljaeger
Kriegt man das überhaupt einigermaßen schnell hin? Müsste man da nicht SDL einbetten?

Das kann ja durchaus "unter der Haube" passieren.
Hängt vom Player ab.
Wenn es zB KMplayer ist und MPlayer als -vo xv hat, dann ist es ein XVideo Overlay.

Darum muss sich die Applikation nicht kümmern.

Ciao,
_

celindir
04-03-2003, 10:57
Original geschrieben von anda_skoa
Hmm, das gibt es schon, ist aber keine triviale Sachen.


Hört sich nicht gerade einfach an :(

Ist denn ein anderer Ansatz denkbar?

Gibt es die Möglichkeit einfach einen vorhandenen MPG-Player aus dem Programm heraus zu starten und von dem einen Rückgabewert über die aktuelle Position zu erhalten?

Also zum Beispiel Kaboodle oder ähnliches. Dann müsste man nur einen Button für den Start der Preview einbauen und die Ausgabe wieder einfangen, oder stell ich mir das mal wieder zu einfach vor??

anda_skoa
04-03-2003, 11:50
So ähnlich läuft das ja mit KParts.

Man fordert vom System eine Komponente mit bestimmten Eigenschaften und benutzt diese dann.

Das sieht in etwa so aus:


#include <ktrader.h>
#include <kservice.h>
#include <klibloader.h>
#include <player.h>

KTrader::OfferList offers = KTrader::self()->query("KMediaPlayer/Player");
if (offers.count() == 0)
return; // no media player available

KLibFactory* factory = KLibLoader->self()->factory(offers.first()->library());
if (factory == 0)
return; // could not load factory

KMediaPlayer::Player* player = factory->create(this, "Player", "KMediaPlayer::Player");
if (player == 0)
return; // error creating player


Ciao,
_

anda_skoa
18-05-2003, 22:07
Hi,

hab mal eine kleine Beispiel Applikation gemacht, die einen Player lädt.

Erstellen mit
#> make -f Makefile.dist
#> ./configure
#> make

Ciao,
_

celindir
26-05-2003, 13:06
Hi anda_soka,

hab ich das richtig verstanden?

Deine App lädt eine Videoplayer-Auswahl, der auf dem System vorhandenen Player und öffnet den ausgewählten??

Kann man es denn auch hinbekommen, dass der Player innerhalb der eigenen Applikation geladen wird und mit dieser kommuniziert (z.b. die aktuelle Position im Film zurückgibt)??

Gruß

tuxipuxi
26-05-2003, 15:29
ich hab mir das von anda_skoa jetzt nicht angeguckt, aber wenn du z.b. eine klasse Player hast die videos abspielen kann, ist das ja kein problem. dann kannst du ja einfach in deine applikation ein objekt dieser klasse einfuegen und noch funktionen play() und stop() und position() und und und implementieren.

anda_skoa
26-05-2003, 16:14
Original geschrieben von celindir
Deine App lädt eine Videoplayer-Auswahl, der auf dem System vorhandenen Player und öffnet den ausgewählten??


Lädt den ausgewählten.



Kann man es denn auch hinbekommen, dass der Player innerhalb der eigenen Applikation geladen wird


Passiert bereits. Darum gings ja eigentlich.
Einen externen Player starten ist ein Einzeiler



(void*) new KRun(url);




und mit dieser kommuniziert (z.b. die aktuelle Position im Film zurückgibt)??


Wenn du dir das Ende der loadPlayer Methode ansiehts, steht da


Player* player = static_cast<Player*>(object);

m_player = player;


m_player ist auch vom Typ KMediaPlayer::Player
http://developer.kde.org/documentation/library/3.1-api/classref/interfaces/KMediaPlayer__Player.html

Also hat man zB die Methode


virtual unsigned long position (void) const

zur Verfügung.

Sieht ziemlich nach Position im Mediatrack aus :)

Ciao,
_

celindir
26-05-2003, 17:12
Asche auf mein Haupt,

ich habe Dein Programm zwar gestartet, aber nicht geblickt, was da wirklich im Quellcode passiert ist. Danke für die Nachsicht!!

Ich würde das Ganze gerne verwenden, verstehe aber das ein oder andere noch nicht ganz.

Ich kann also mit
KPlayerEmbed *kplayerembed = new KPlayerEmbed();
einen neuen Player erzeugen und den in meiner Anwendung anzeigen lassen
a.setMainWidget(kplayerembed);
kplayerembed->show();

Dann stehen mir auch die Methoden aus KMediaPlayer::Player zur Verfügung und ich könnte mit

unsigned long my_position = kplayerembed->position()
die aktuelle Abspielposition bekommen.

Aber wie übergebe ich die Datei, die abgespielt werden soll??

anda_skoa
26-05-2003, 17:19
Original geschrieben von celindir
Ich würde das Ganze gerne verwenden, verstehe aber das ein oder andere noch nicht ganz.


Kein Problem, ist ja auch nicht so einfach.

KPlayerEmbed ist die Widget Klasse meiner Beispiel Applikation.
Die hat nix mit dem Player zu tun.

Die ganze Player Geschichte ist in loadPlayer().
Du machst das einfach so ähnlich in deinem Widget, nur ohne Auswahl, etc.



Aber wie übergebe ich die Datei, die abgespielt werden soll??

Da musste ich vorhin auch nachschaun ;)
Einfach der Ableitungshierachie von KMediaPlayer::Player folgen.

Kleiner Hinweis: bei den slots suchen

Ciao,
_

celindir
27-05-2003, 09:54
Leider bekomme ich immer einen Fehler beim compilieren:


undefined reference to `KTrader::self()'

dabei habe ich bei dem KTrader Aufruf gar nichts verändert.

// Query for media players
KTrader::OfferList offers = KTrader::self()->query("KMediaPlayer/Player");


Das Beispiel von anda_soka läuft ohne zu murren. :confused:

Die includes sind auch drin

// Qt includes
#include <qinputdialog.h>
#include <qlayout.h>

// KDE includes
#include <kmessagebox.h>
#include <klibloader.h>
#include <ktrader.h>

// KMediaPlayer includes
#include <kmediaplayer/player.h>
#include <kmediaplayer/view.h>

using KMediaPlayer::Player;
using KMediaPlayer::View;

Sorry, wenn ich so hartnäckig bin, aber ich finde die Idee genial und es ist genau das, was in meinem ersten Projekt noch fehlt. Danke!

tuxipuxi
27-05-2003, 10:34
hast du auch gegen die richtigen libs gelinkt?

anda_skoa
27-05-2003, 10:50
Original geschrieben von tuxipuxi
hast du auch gegen die richtigen libs gelinkt?
Ja, wäre auch meine Frage gewesen.
Sieht nach Fehlen von -lkio aus

Ciao,
_

celindir
27-05-2003, 11:05
Original geschrieben von tuxipuxi
hast du auch gegen die richtigen libs gelinkt?

Sorry, ich bin noch dummer KDevelop-Nutzer,

Ich habe nur ein neues KDE Mini Projekt erstellt und den code von Anda_soka da reinkopiert.

Meins bring die Fehlermeldung seins nicht.

Wo muss ich denn die gelinkten libs überprüfen??

Danke für Eure Geduld!

anda_skoa
27-05-2003, 12:02
Projekt->Optionen->Linker Optionen oder so.
kio ist dort eine checkbox.

Kannst du in meinem Projekt nachsehen.

Ciao,
_

celindir
27-05-2003, 12:59
Vielen Dank,

das Kästchen heisst kparts

Man muss nur wissen wie:)

Werd jetzt mal weiter probieren.

Wünscht mir Glück - sonst kommen noch mehr Fragen :D

celindir
27-05-2003, 21:25
Original geschrieben von anda_skoa

Da musste ich vorhin auch nachschaun ;)
Einfach der Ableitungshierachie von KMediaPlayer::Player folgen.

Kleiner Hinweis: bei den slots suchen

Ciao,
_

Hi da habe ich auch was gefunden...

bool _openURL ( const KURL &url )
[virtual slot]
Only reimplement openURL if you don't want synchronous network transparency
Otherwise, reimplement openFile() only .
If you reimplement it, don't forget to set the caption,
usually with emit setWindowCaption( url.prettyURL() );

aber verstanden hab ich es noch nicht. Ich hab nach wie vor meine Probleme die QTDoku sauber zu lesen.

Ich brauche da immer ein praktisches Beispiel, wie das von anda_soka, was inzwischen bei mir (Dank Eurer Tipps) auch läuft.

Jetzt habe ich das Ganze so in mein Programm eingebunden, dass bei Klick auf einen Button der player gestartet und angezeigt wird.

Aber nach wie vor habe ich kein Film, der angezeigt wird.

Ich habe in einem QString = le_input_file->text() den Film, der angezeigt werden soll.

Nur wie sag ich das dem player

@anda_soka
Ich finde es super, wie Du mir versuchst zu helfen und ich finde es auch richtig, dass Du versuchst, mir die Hinweise zur Lösung zu geben und nicht die Lösung selbst zu präsentieren. Das Problem ist nur, dass ich mich mit meinem Projekt schon weit über meine Fähigkeiten hinaus vorgewagt habe und da verlässt mich im Bezug auf den Player gerade etwas die Peilung.

Ich hatte schon einen eigenen "Player" gebastelt, der immer ein Standbild aus dem Film an der entsprechenden Position angezeigt hat. Das geht zur Not auch aber der Player wäre auf jeden Fall besser.
Wenn alles klappt, dann wird das Programm auch veröffentlicht und eine Widmung für Euch ist in jedem Fall dabei, aber es sind noch einige Fehler drin, die ich aber hoffentlich selber rausbekomme.

Ein Codebeispiel für die Übergabe des input_file und ich verspreche, ich versuche es zu verstehen und nicht nur abzuschreiben :)

Vielen Dank

anda_skoa
27-05-2003, 21:53
Original geschrieben von celindir
Hi da habe ich auch was gefunden...

bool _openURL ( const KURL &url )
[virtual slot]
Only reimplement openURL if you don't want synchronous network transparency
Otherwise, reimplement openFile() only .
If you reimplement it, don't forget to set the caption,
usually with emit setWindowCaption( url.prettyURL() );


Bingo :)



aber verstanden hab ich es noch nicht. Ich hab nach wie vor meine Probleme die QTDoku sauber zu lesen.


In diesem Fall KDE Doku. In den Spezialbereichen ist die KDE API leider nicht immer vollständig dokumentiert und selbst wenn, meist für ziemlich erfahrene Entwickler.

Die Doku, die du zitiert hast, richtet sich zum Beispiel an Entwickler, die selber KParts implementieren und darum wissen müssen, welche Methoden sie implementieren müssen, etc.

Für dich als Benutzer ist hier zB nur wichtig, dass es eine Methode zum Öffnen einer URL gibt und eine zum Öffnen eines Files.

Ciao,
_

celindir
27-05-2003, 22:18
Original geschrieben von anda_skoa

Für dich als Benutzer ist hier zB nur wichtig, dass es eine Methode zum Öffnen einer URL gibt und eine zum Öffnen eines Files.

Ciao,
_

Bitte!!!

Ein Codebeispiel!!

Ich hab schon zu viel ausprobiert, mir fehlt der richitge ansatz

m_player->openURL(e_input_file->text() );

wollte nicht und auch ander Versuche schlugen fehl!

Bitte keinen Hinweis sondern eine Lösung

Danke

anda_skoa
27-05-2003, 23:01
Hi,

tut mir leid, war nicht ganz so trivial wie ich eigentlich dachte, weil openURL nicht eindeutig ist



KURL url;
url.setPath("/home/user/film.avi");
static_cast<KParts::ReadOnlyPart*>(m_player)->openURL(url);


KURL::setPath für das Erzeugn lokaler URLs.
Du könntest auch


KURL url("file:"+path);

machen

Wenn du die Datei über den File Dialog erhälts könntest du auch gleich eine KURL bekommen. (siehe KFileDialog::getOpenURL)

Ciao,
_

celindir
28-05-2003, 08:47
Original geschrieben von anda_skoa
Hi,

tut mir leid, war nicht ganz so trivial wie ich eigentlich dachte_
Danke!
Und ich dachte schon, es läge an mir, aber wenn selbst Du es für nicht ganz so trivial hälst...

Auf jeden Fall funktioniert es jetzt so und ich habe den Ansporn, mich weiter damit zu beschäftigen, weil ich erstmal weiss, das es überhaupt geht.

Jetzt geht es an die detaillierte Implementierung (Wechseln des Films, Rückgabe der Position etc.) Aber da bin ich jetzt zuversichtlich, dass ich das hinbekomme.

Also, noch mal vielen Dank an alle Helfer, besonders anda_soka und tuxipuxi.

"You really made my day!"