Video-Manager "Vipla"

Hier können eigene Projekte, die mit Qt in Beziehung stehen vorgestellt werden.
Antworten
listeman
Beiträge: 74
Registriert: 19. Mai 2009 13:54
Kontaktdaten:

Video-Manager "Vipla"

Beitrag von listeman »

Hallo Leute,

habe jetzt schon seit längerem immer mal wieder hier im Forum Hilfe gesucht, und würde jetzt gerne auch mal ein Projekt vorstellen :)

Mich hat immer etwas gestört, dass ich keinen einfachen Video-Manager für Linux finden konnte, also einer, der einfach ein Verzeichnis (mit Unterverzeichnissen) einliest, anzeigt (mit Thumbnail) und abspielt. Naja, habe mich dann endlich mal dazu entschlossen, selbst was zusammenzustellen: http://mesh.dl.sourceforge.net/project/ ... 0.1.tar.gz

Das ist mal so der erste Entwurf. Über Kommentare/Verbesserungsvorschläge freue ich mich natürlich sehr :)
listeman
Beiträge: 74
Registriert: 19. Mai 2009 13:54
Kontaktdaten:

Beitrag von listeman »

Hab jetzt mal eine weitere Version von Vipla mit einigen Änderungen hochgeladen... würde mich sehr darüber freuen, etwas feedback zu bekommen, da dies eines der ersteren etwas größeren Dinge ist, die ich programmiere :)

Projektseite:
http://sourceforge.net/projects/vipla/

Direkter Link zu Version 0.2:
http://surfnet.dl.sourceforge.net/proje ... 0.2.tar.gz
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Was mir auf die Schnelle auffällt:
*) Du includierst EINFACH ALLES in mainwindow.h. Gewöhn dir gleich jetzt an, nur das einzubinden, was wirklich notwendig ist, für den Rest forward-declarations.
*) Dein designer-Einsatz lässt zu wünschen übrig, du machst noch immer fast alles per Hand. Leg doch gleich im Designer eine toolbar an, platzier die labels in Layouts usw.
*) Die Datenbank macht nicht viel Sinn, da sie nur als Zwischenschicht genutzt wird. Filesystem + ffmpegthumnailer sind sehr schnell. Lass die DB weg, und lies bei jedem Start die Daten erneut aus. Wenn du mit deiner DB z.B. ein neues Video einfügst, wird das niemals auftauchen, wenn du nicht die DB neu initialisierst.
*) Der Aufbau ist extrem monolithisch. Du hast nur eine Klasse "MainWindow", die alles macht, und noch viel mehr ;) (deine mainwindow.cpp hat bald 2000 zeilen...)
- schreib dir eine Klasse "VideoFrame", die nur dazu da ist, ein Video anzuzeigen und auf MouseEvents/resizeEvents/... zu reagieren. Vllt. ein paar SLOTS wie "play, pause, setFilename, ..." zum Steuern. Damit sparst du dir gleich ordentlich Code in MainWindow.
- selbiges für eine Klasse "PlayList", die mit einer "VideoCollection"-Instanz zusammen arbeitet und bei Auswahl einzelner Videos Signale aussendet.
- Gibt sicher noch mehr zu sagen, aber meine Katze hat was degegen - muss jetzt kuscheln :D

Ciao
Franz
listeman
Beiträge: 74
Registriert: 19. Mai 2009 13:54
Kontaktdaten:

Beitrag von listeman »

Danke :)

Die Vorschläge hören sich recht gut an, damit werde ich mich mal nen Weilchen beschäftigen.

Doch in einem Punkt widerspreche ich dir. Du sagtest:
Die Datenbank macht nicht viel Sinn, da sie nur als Zwischenschicht genutzt wird. Filesystem + ffmpegthumnailer sind sehr schnell. Lass die DB weg, und lies bei jedem Start die Daten erneut aus. Wenn du mit deiner DB z.B. ein neues Video einfügst, wird das niemals auftauchen, wenn du nicht die DB neu initialisierst.
In meinen Videoordnern z.B. habe ich neben einigen Filmen auch recht viele Videos von YouTube, alles zusammen ca. 700 Dateien. Wenn ich bei jedem Start diese Dateien neu einlese, Miniaturbild mit ffmpegthumbnailer erstelle und Meta-Informationen mit mediainfo zusammenstelle, dann habe ich jedesmal ca. einen drei-Minuten-Start. Wenn ich die Daten einmal in eine Datenbank einlese, dann habe ich einen drei-Sekunden-Start.
Es ist richtig, dass das Hinzufügen eines Videos eine Aktualisierung der Datenbank erfordert, dies dauert jedoch normalerweise nur wenige Sekunden (ich suche nur nach neuen Dateien), besser als bei jedem Programmstart erst mal Kaffee kochen zu gehen ;)
Und eine Datenbank vereinfacht auch eine Suche erheblich. Ein Query einer Datenbank ist sehr schnell und einfach erledigt.

Der Rest deiner Vorschläge gefällt mir ganz gut... :)


[Edit]:
Ach ja, die Sache mit dem Designer: Bisher habe ich im Designer noch nicht die Möglichkeit gefunden, Phonon-Elemente hinzuzufügen. Da ich die jedoch in die Toolbar packen wollte, dachte ich, ich erstelle sie einfach komplett per Hand (geht ja eig recht einfach).
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Ich hab jetzt auch mal versucht das Ding zu übersetzen... No Chance, ohne viel zu viel Aufwand!
*) Welche MediaInfo-Version verwendest du? Bei mir existiert der Header nicht, das "DLL" musste ich beim Include löschen. Der namespace "MediaInfoDLL" heißt bei mir "MediaInfoLib".
*) Ein statischer Pfad zu einer Lib unter "LIBS" kommt immer gut. Schön dass das bei mir nicht stimmt.

Code: Alles auswählen

LIBS += -lmediainfo
muss reichen.
*) Du nimmst keine Rücksicht darauf, ob MediaInfo mit oder ohne UNICODE übersetzt wurde. Bei dir scheinbar ohne, bei mir mit -> char vs wchar_t.
Die statischen Strings (MediaInfo::Option) bitte UNBEDINGT mit dem Macro __T() erzeugen (kommt aus MediaInfo_Const.h). Für die Integration mit QString darfst DU dir was einfallen lassen - hier bin ich erstmal ausgestiegen. Bastel dir ein template, mit entsprechenden Spezialisierungen, o.Ä.

Wg. Datenbank: Schau mal in Richtung amarok. Wenn der Button zum Auswählen in der Toolbar steht, ist das quasi ein Feature, ständig das Dir wechseln zu können. Da wäre für mich eine DB ein NoGo - DB ist kein temporärer Cache. Wenn du ne DB nimmst, dann verlager das Dir einstellen in einen Config-Dialog. Am besten lass den User mehrere Verzeichnisse hinzufügen, denn dann lohnt sich ne DB wirklich.
Ohne DB geht es aber trotzdem: Ein Verzeichnis ".thumbs" in die indizierten (Sub)Dirs und eine Datei .vipla.info. In der Datei steht dann einfach kommasepariert alles drinnen, was du mit MediaInfo so intensiv ausgelesen hast. Dadurch kannst du deine Video-DB-app in einen einfachen Vide-DateiBrowser verwandeln.
Wg. Suchen: Das geht auch wunderbar nur mit den Model/View-Klassen, da geht sogar RegExp :P - also auch kein Kriterium für DB.

Zu guter Letzt: Hast du denn schonmal gemessen, wie lange so ein Start ohne DB wirklich dauert? denn die 3 Minuten kommen mir spanisch vor. Mein Dolphin braucht zum ThumbNailern absolut nicht lange! Kann es sein dass du einfach (total suboptimal) 700 einzelne INSERTS in die DB jagst? Das ist ein ABSOLUTER Performancekiller, und wird die Ladezeit vervielfachen.

Ich will jetzt nicht sagen, dass DB schlecht ist und du drauf verzichten sollst. Du solltest halt einfach dein Programm und die Nutzerinteraktion einer DB anpassen - und das beißt sich mit dauernden "DROP TABLE" wenn der User was anderes sehen will...
Und wenn schon DB dann bitte gleich richtig mit QSqlDatabaseModel - deine DB nehmen um ein StdItemModel zu füllen degradiert die DB wieder zum reinen (langsamen) Cache.

Wg. Deisgner + Phonon: Entweder Widget für phonon-Controls als Platzhalter einsetzen (kommt doof, da man dann phonon-Header angeben muss, die sich von System zu System natürlich unterscheiden) oder dann die Controls via Layout einbinden. Aber die Phonon-Sachen sind doch eh das wenigste, ich meinte eher die ganzen Actions + Labels, die gehen nämlich sehr gut mit Designer!
listeman
Beiträge: 74
Registriert: 19. Mai 2009 13:54
Kontaktdaten:

Beitrag von listeman »

Hm, also ich habe mich wegen mediainfo im Mediainfo-Forum schlaugemacht (http://sourceforge.net/projects/mediain ... ic/3932196). Angeblich wird die MediaInfoDLL und die MediaInfoLib beide mitgeliefert... hier ist mal die Antwort, die ich bekommen habe:
official binaries are compiled with -D_UNICODE, so you must put this option in your code if you want to use include/MediaInfo/MediaInfo.h. Then the expected type is a wstring (without this, the configuration is different between the include and the binary) else use the adaptation layer /MediaInfoDLL/MediaInfoDLL.h, both Ansi/Unicode versions are available with this #include.
Die MediaInfoDLL sollte also irgendwo verfügbar sein...
Das mit dem Linken, da haste recht, das war net schlau, das statisch zu machen...

Hm, okay, ohne datenbank, das sieht auch machbar aus...
Momentan sind mehrere Quellen jedenfalls problemlos möglich. Man kann theoretisch so viele hinzufügen, wie man möchte. Momentan muss man alle halt einzeln hinzufügen. Da wäre es evtl. wirklich besser, es mit einem Config-Dialog zu lösen und alles in einem Vorgang zu ermöglichen.
SQLite bietet zwar nicht die Möglichkeit, mehrere Datenzeilen auf einmal einzufügen (also in einem Query), sondern es gibt die Möglichkeit einer transaction (was ich auch mache). Ein "DROP TABLE" steht (zumindest in der zweiten Version) nirgends mehr im Code. Einträge aus der Datenbank werden nur dann gelöscht, wenn die dazugehörige Quelle aus der Datenbank entfernt wird, oder Dateien verschoben/gelöscht werden. Ein Aktualisieren der Datenbank schaut nur nach Änderungen, liest aber nicht einfach alle Dateien neu ein.

Ein QSqlQueryModel sieht ganz gut aus, das werde ich mir mal genauer anschauen. wäre definitiv erheblich schneller.

Momentan habe ich den Designer komplett gestrichen, sondern mache es per Hand. Z.B. leite ich erst mal QFrame ab und füge Videofunktion hinzu (mit einigen nützlichen Slots), dann füge ich den QFrame in mein Hauptfenster ein (Ähnliches mache ich mir dem Tableview und der Toolbar). Da das layout wirklich sehr, sehr simpel ist, braucht es nur sehr wenige Zeilen, das Layout zusammenzustellen. Und der Code ist mit mehreren Klassen allerdings sehr viel übersichtlicher und einfacher. Habe das bisher noch nie so gemacht, doch es gefällt mir :)
androphinx
Beiträge: 170
Registriert: 26. Januar 2009 09:19
Wohnort: 127.0.0.2

Beitrag von androphinx »

Also ich habe mir jetzt das Projekt nicht angeschaut, aber ich muss mich mal beim Thema Datenbank reinhängen:
Ich habe mal den Test gemacht und 100 Videos gethumbnailt (Nautilus) und 100 Bilder in Thumbnailgröße geöffnet. Ergebnis ist glaube ich äußerst eindeutig:
100 Videos: Ewig
100 Bilder: 2 sec

Gerade wenn die Festplatte doch mal etwas langsamer ist, können hier schnell deutliche unterschiede entstehen. Fakt ist aber, dass eine ständige Neugenerierung langsamer ist, als das ganze aus einer Datei / Datenbank zu lesen.

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

Beitrag von franzf »

Das DB-"Problem" (DROP TABLE, nur 1 DIR und die Selection an prominenter Stelle) hab ich noch aus v1. Ich wollte da schon etwas schreiben, hatte dann aber nicht die Muse, die Erkenntnisse hab ich ungeprüft verwendet.
In der jetzigen Form ist eine DB i.O. Man kann das noch optimieren. Z.B. entsprechendes Model verwenden, die Previews als BLOB speichern. Aber bevor ich jetzt noch mehr schreib, wart ich lieber auf ne neue Version, nicht dass mein Gesagtes schon wieder verkehrt ist ;)
listeman
Beiträge: 74
Registriert: 19. Mai 2009 13:54
Kontaktdaten:

Beitrag von listeman »

Okay, habe jetzt eine neue Version hochgeladen: http://biznetnetworks.dl.sourceforge.ne ... 0.3.tar.gz

Habe es schon seit ein paar Tagen fast fertig, doch hatte recht viel mit meinem Studium zu tun... geht jetzt in den Endspurt des Semesters :)

Wie schon erwähnt, habe ich den designer komplett gestrichen... und auch den Umgang mit der Datenbank habe ich in einem Punkt geändert: Bisher hat eine Suche das Model immer neu aufgebaut (also Daten neu aus der Datenbank geladen). Jetzt verstecke ich einfach nur die nicht passenden Einträge. Das macht das ganze sehr viel schneller :)
Den Rest (Aktualisieren/Löschen/Hinzufügen) ist bisher noch so ziemlich das gleiche wie in Version 0.2...

Ein paar Sachen sind mir schon aufgefallen, die ich verbessern kann, z.B. die Rechtsklick-Menus und noch ein paar Sachen...

Nebenbei: Ich habe mich ein paar mal daran versucht, die Beschriftung der Einträge mit QItemDelegate zu formatieren, doch alle meine Bemühungen sind bisher fehlgeschlagen. Und auch die Doku von Qt hat mir irgendwie nicht so sehr viel geholfen... gibt es da irgendwo eine Doku, die verständlich darlegt, wie man Einträge formatieren kann (also, ich meine nicht nur Farbe, sondern auch Größe, Fett-/Normaldruck, etc.)

Viele Grüße
listeman
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

listeman hat geschrieben:wie man Einträge formatieren kann (also, ich meine nicht nur Farbe, sondern auch Größe, Fett-/Normaldruck, etc.)
Schrift = Font -> QFont. Verwendest du noch QStandardItemModel? Dann QStandardItem::setFont().
Ansonsten: model->setData() font für Qt::FontRole setzen.
listeman
Beiträge: 74
Registriert: 19. Mai 2009 13:54
Kontaktdaten:

Beitrag von listeman »

Danke, aber damit kann ich ja nur eine Formatierung für ein komplettes Item vornehmen. Doch ist es auch möglich, einzelne Textabschnitte unterschiedlich zu formatieren, also unterschiedliche Größe/Farbe?



Seit letztem Wochenende habe ich ganz plötzlich ein seltsames Problem: Ich bekomme kein mouseDoubleClickEvent mehr, wenn ich auf den Frame mit einem Phonon-Widget doppelklicke. Dieses Problem konnte ich auch mühelos reproduzieren. Hier poste ich mal ein simples Beispiel. Würde sehr gerne wissen, ob das irgendein Problem nur in meinem System ist oder ob sich bei Qt etwas geändert hat:

mainwindow.h:

Code: Alles auswählen

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtGui/QMainWindow>

#include <QtDebug>
#include <QFrame>
#include <QHBoxLayout>
#include <QWidget>
#include <QEvent>

#include <phonon/VideoWidget>
#include <phonon/MediaObject>

class MainWindow : public QMainWindow {
	Q_OBJECT

public:
	MainWindow(QWidget *parent = 0);
	~MainWindow();

protected:
	bool event(QEvent *);
};

#endif // MAINWINDOW_H
mainwindow.cpp:

Code: Alles auswählen

#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {

	Phonon::MediaObject *mediaObject = new Phonon::MediaObject;
	Phonon::VideoWidget *videoWidget = new Phonon::VideoWidget;
	Phonon::createPath(mediaObject,videoWidget);

	QFrame *frame = new QFrame;
	frame->setStyleSheet("background-color: black");
	frame->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);

	QHBoxLayout *frameLayout = new QHBoxLayout;
	frameLayout->addWidget(videoWidget);
	frame->setLayout(frameLayout);

	QHBoxLayout *layout = new QHBoxLayout;
	layout->addWidget(frame);

	QWidget *centralWidget = new QWidget;
	centralWidget->setLayout(layout);
	this->setCentralWidget(centralWidget);

}

bool MainWindow::event(QEvent *event) {
	qDebug() << "MainWindow Event:" << event->type();
}

bool Phonon::VideoWidget::event(QEvent *event) {
	qDebug() << "VideoWidget Event:" << event->type();
}

MainWindow::~MainWindow() {
}
main.cpp:

Code: Alles auswählen

#include <QtGui/QApplication>
#include "mainwindow.h"

int main(int argc, char *argv[]) {
	QApplication a(argc, argv);
	MainWindow w;
	w.show();
	return a.exec();
}

Ein Klick oder Doppelklick auf das VideoWidget, beide melden kein Event. Wenn ich jedoch auf den Rahmen doppelklicke (dort, wohin sich bedingt durch den Layout-Rahmen das VideoWidget nicht erstreckt), dort bekomme ich sowohl MouseButtonDblClick (4), MouseButtonPress (2), als auch MouseButtonRelease (3) gemeldet.

Doch ich versteh das überhaupt nicht, das ergibt einfach keinen Sinn für mich...
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Das sind aber jetzt Fragen die wir nicht in diesem Thread verstecken müssen/sollten. Mach für deine Probleme unter "Qt Programmierung" eigene Threads auf, dann haben alle was davon :)
listeman
Beiträge: 74
Registriert: 19. Mai 2009 13:54
Kontaktdaten:

Beitrag von listeman »

Gute Idee :)
SeGo
Beiträge: 5
Registriert: 3. April 2011 15:25

Beitrag von SeGo »

Hi,
ich weiß zwar, dass der Thread schon ein bisschen älter ist aber ich würde deine videoverwaltung trotzdem gerne mal ausprobieren, da ich etwas ähnliches Programmieren möchte.
Leider bekomme ich beim Compilen immer den Fehler, dass MediaInfo nicht gefunden werden kann. Was muss ich genau machen um dieses Problem zu lösen

Grüße
SeGo
Antworten