Zobrazit příspěvky

Tato sekce Vám umožňuje zobrazit všechny příspěvky tohoto uživatele. Prosím uvědomte si, že můžete vidět příspěvky pouze z oblastí Vám přístupných.


Témata - Vláďa J

Stran: [1]
1
Vývoj / Qt a multimediální backend
« kdy: 24. 02. 2014, 15:39:51 »
Hezký den všem,

mám trochu dost specifickou otázku a nevím, jestli mi vůbec bude někdo tady schopný poradit, ale za pokus nic nedám.

Kdysi jsem vytvořil přehrávač primárně pro můj tablet s Windows napsaný v Pythonu a Qt4/QML. K vidění je tady.

Jelikož projekt PySide a s ním i portace Pythonu na mobilní OS (Android, Sailfish, Ubuntu, Tizen) je v podstatě mrtvý, rozhodl jsem se program přepsat do Qt5 a C++. Narazil jsem ale na poměrně zásadní problém.

Základní funkcí, bez které si nedokážu použitelný přehrávač představit, je podpora replay gain, tedy vyrovnání hlasitosti různých skladeb. Funguje to tak, že se soubor oskenuje a do tagu se zapíše hodnota o kolik se má zesílit nebo zeslabit tak, aby všechny skladby hrály stejně hlasitě. V předchozí Qt4 veriz jsem jako backend používal Phonon a ten měl funkci setVolumeDecibel, která umožňovala hlasitost srovnat. V Qt5 se přešlo na QtMultimedia a tato funkce zmizela. Existuje pouze setVolume s rozsahem hodnot 0-100, což je pro moje účely nepoužitelné.

Nastává teda otázka, co dál. Jedna možnost je nabourat se nějak hlouběji pod kapotu QtMultimedia a tam s hlasitostí hýbat. Na to ale rozhodně moje znalosti a schopnosti nejsou dostatečné, s C/C++ teprve začínám. Další možností je použít komplet jiný backend. Napadá mě GStreamer a libVLC.

GStreamer běží na platformách na které mířím - Windows, Linux a Android. Ale je to obrovský balík a hlavně je postavený kolem GTK+. Existuje sice nějaký binding QtGstreamer, ale ten je postavený na zastaralých knihovnách GStreamer 0.10 a zdá se, že vývoj pro 1.x nějak usnul...

Další možností je libVLC. I ta knihovna by měla fungovat na všech požadovaných platformách, ale nemám s ní vůbec žádné zkušenosti. Ale dostupná dokumentace mi přijde poměrně nekompletní a nevím, jestli to není vzhledem k mým slabým znalostem C/C++ příliš low-level záležitost.

Máte s tím někdo nějaké zkušenosti? Také jsem slyšel, že je problém s dynamicky linkovanými knihovnami na Androidu. Je to pravda?

Předem děkuju za jakoukoliv radu.

2
Vývoj / SQL - pomoc s dotazem
« kdy: 25. 10. 2013, 10:29:03 »
Ahoj,

potřeboval bych pomoct s SQL dotazem s následujícíma podmínkama:

Mam tabulku v ní dva sloupce A a B s textem. Potřeboval bych do jednoho výstupu dostat kombinaci A a B seřazenou podle abecedy. Problém je ten, že A a B budou v některých případech obsahovat to samý, v tom případě tam chci takový záznam jenom jednou.

Jak si s tím poradit? Je to nějaký jednoduchý postup? Díky!

3
Vývoj / Použití knihovny (C++)
« kdy: 08. 10. 2013, 12:16:38 »
Ahoj,

před časem jsem si pro svoje potřeby napsal hudební přehrávač v PySide (Python + Qt), který používám v autě na tabletu s Windows 7. Problém je v tom, že použitý backend Phonon je ve spojení s DirectShow extrémně nespolehlivý a jsem stále zaseknutý na starých Qt 4 knihovnách. Nezdá se, že by projekt PySide někdy v dohledné době podporu Qt 5 přidal. Kromě toho bych rád můj púřehrávač portoval i na Android a Ubuntu Touch.

Zkrátka situace dospěla do bodu, kdy je nutné přejít z Pythonu na C++. A to je problém, protože C++ skoro vůbec neznám. Není problém implementovat valnou část funkcí v JavaScriptu přímo v QML. Moje původní idea byla, že celý přehrávač bude jenom QML a jediné, na co použiju C++ bude načtení souborů na disku (to přímo z QML nelze). Celé by klaplo nebý toho, že QML objek pro přehrávání MediaPlayer a jeho metaData nefunguje ve Windows a na Androidu jenom omezeně. Načíst vešekrý možný tagy a podle nich vyhledávat v kolekci je přitom základní věc, kterou od přehrávače chci a proč si programuju svůj vlastní.

V Pythonu jsem používal knihovnu MediaInfo, která toho umí načíst opravdu hodně. Bohužel neumí zapisovat dp tagů. Bez toho bych se lehce obešel, ale nenašel jsem nikde verzi pro Android. Takže bych si jí musel nejspíš sám zkompilovat. A když už kompilovat nějakou céčkovou knihovnu, tak proč ne třeba TagLib, která umí všechno. Prostě váhám a nemám dost informací k tomu, abych se mohl rozhodnout. :-)

Za prvé mi není úplně jasný, jaký je z mého pohledu rozdíle mezi dynamickou a statiskou knihovnou. Předpokládám, že pokud používám dynamickou, stačí mi už předem zkompilovaná .dll knihovna (jako jsem jí používal v Pythonu). TagLib je distribuovaná jenom ve formě zdrojáku, takže si jí musím sám zkompilovat, ale to by asi neměl být výrazný problém. Kdybych chtěl použít knihovnu staticky, je to dobrý nápad? Má to pro mě nějaké výhody nebo naopak nevýhody?

Co všechno potřebuju k tomu, abych knihovnu mohl používat? Stačí .dll nebo k tomu potřebuju i hlavičkový soubor? Co je zač soubor s příponou .a? Jak se liší v .cpp souboru použití dynamický a statický knihovny?

Budu rád za odkaz na nějaký text, kde to je vysvětlené. Bohužel skoro všechno, co je na internetu, se týká obyčejného C. Jako IDE používám QtCreator, ale to by asi nemělo hrát zásadní vliv.

Omlouvám se za tolik omáčky okolo. Ale chtěl jsem vysvětlit, že programovat umím a nepředstavuju si to jako Hurvínek válku. Akorát neznám C++ a nechci zabíhat víc do hloubky než je nutný. Většinu věcí chci dělat v JavaScriptu a v C++ pouze načíst adresářový strom (to už mám implementované) a potom soubor po souboru načtat tagy a ukládat je do databáze (to už bude zase v QML přes QSql).

4
Sítě / Monitoring sítě
« kdy: 11. 05. 2013, 16:25:00 »
Ahoj,

mám Kubuntu 13.04 a hned po spuštění vidím v síťovém provozu, že se něco někam odesílá rychlostí cca 180 KiB/s. Zajímalo by mě, který program nebo služba to má na svědomí. Jak se tohle dá v Linuxu zjistit?

5
Vývoj / Výpis adresářů a souborů v C++
« kdy: 13. 05. 2012, 22:35:45 »
Zdravím,

dneska jsem se začal učit programovat v C++ a tak trochu tápu. Po hodině marnýho hledání jsem se rozhodl, že se radši zeptám.

Pro potřeby mýho programu (snažím se při učení alespoň vyprodukovat něco užitečnýho) potřebuju získat výpis podadresářů a souborů. Našel jsem následující kód:

Kód: [Vybrat]
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>

int
main (void){
    DIR *dp;
    struct dirent *ep;   
    dp = opendir ("./");
    if (dp != NULL){
        while (ep = readdir (dp))
            puts (ep->d_name);
        (void) closedir (dp);
    }
    else
        perror ("Couldn't open the directory");   
    return 0;
}

V podstatě to dělá to, co potřebuju. Akorát ještě musím projít rekurzivně všechny adresáře a neumím zjistit, jestli je něco adresář nebo soubor. Našel jsem, že struktura dirent by mohla mít položku d_type, ale minimálně na Windows s MinGW to nefunguje.

6
Vývoj / Pomoc se strukturou databáze
« kdy: 12. 12. 2011, 17:03:20 »
Ahoj,

Vyvíjím v PySide/QML multimediální přehrávač. Zatím zvládá pouze hudbu, ale do budoucna počítám i s videem. To ale není podstatné.

Jeden z hlavních důvodů, proč jsem se rozhodl vytvořit vlastní přehrávač je to, že jsem potřeboval takový, který půjde ovládat prstem na dotykovém displeji a bude mít dobrou správu knihovny (dynamické playlisty, třídění podle žánru, umělce, alba atd.) Žádný takový přehrávač není (nebo jsem na něj zatím nenarazil), tak jsem si napsal svůj vlastní.

Jeden z problémů, který řeším, a jako naprostý laik v této oblasti neumím posoudit, je struktura databáze pro knihovnu. Momentálně mám pouze jednu databázi, ve které je na každém řádku asi 20 údajů ke každé písničce. V přehrávači potom s každou písničkou pracuji jako s objektem můžu se odkazovat na tyto vlastnosti. Takhle to funguje a je to i relativně rychlé.

Problém nastává, jako když si třeba teď vzpomenu, že u každé písničky chci mít nově přístupný nějaký nový údaj z tagů (teď je to BPM, příště to bude třeba počet přehrání). Jak tohle efektivně vyřešit? V mém případě to znamená přepsat kód na několika místech, smazat databázi a vytvořit novou s jiným počtem řádků. Samozřejmě po prvním spuštění na mě vypadne spousta chyb, protože aktuální databáze bude mít jiný počet řádků.

Jaké je správné a efektivní řešení mého problému? Fascinuje mě rychlost a funkčnost přehrávače foobar2000. Chtěl bych dosáhnout něčeho podobného. V podstatě celý kód, který pracuje s daty a databází je napsaný v Pythonu 2.x s SQLite pluginem, v tom by snad problém být neměl, doufám. Qt/QML je použité pouze pro uživatelské rozhraní.

Práce s databází (například vyfiltrování všech skladeb jednoho žánru) musí být dostatečně rychlá (do 0,1s). Navíc přehrávač používám na UMPC s Atomem, do budoucna ho možná portuju i na telefony s Androidem (až bude PySide pro Android) a další zařízení s podporou Pythonu a Qt. Každopádně mi na výkonu poměrně dost záleží a bojím se, že pokud udělám tabulku třeba se 100 sloupci, bude to mít negativní vliv na rychlost.

Předem díky za rady.

7
Vývoj / PySide + QML (alias QtQuick)
« kdy: 15. 11. 2010, 17:21:28 »
Zdravím,

chtěl bych se poradit se zkušenějšími ohledně použití PySide (LGPL alternativa PyQt od Nokie) a QML (Qt Quick). Už nějakou dobu se snažím vytvořit přehrávač s dotykovým ovládáním vhodný pro zařízení s displejem okolo 5" (mám momentálně 5" MID, kvůli kterému chci hlavně takový program napsat).

Mám takový polofunkční prototyp udělaný v PyQt, ale bohužel rekace GUI a celkově ovládání prstem má do ideálu celkem daleko.

Po vydání Qt 4.7 jsem viděl demo QML a to mě uchvátilo. Tohle je to, co chci. Mou cílovou platformou jsou Windows a Linux, což QML splňuje. Proč k tomu PySide? Mám již hotovou logiku přehrávače včetěn práce s databází v Pythonu. Navíc v C++ neumím.

Zatím se mi ale nedaří najít moc informací ohledně vývoje aplikací v PySide+QML. Našel jsem nějaké příklady, které ale na Windows nefungují. V Ubuntu se mi zase nechce PySide nainstalovat kvůli konfliktům ve verzi. Navíc mi pořád trochu uniká logika fungování. Pokud to chápu dobře, tak reakce GUI vlastně neřeším v Pythonu, ale píšu je v .qml souboru pomocí JavaScriptu (který neumím, ale holt bych se to doučil). Jenže mi není moc jasné, jak by fungovala následující věc:

Základem je pro mě menu pro výběr souboru, který má hrát. Představoval bych si ho jako 5 sloupců, ve kterých budou položky: dynamický playlist/žánr/umělec/album/skladba. V landscape režimu budou zobrazeny 2 sloupce, v portrait pouze jeden. Mezi sloupci se budu moct pohybovat posouváním v horizontálním směru. Vertikálně si potom budu vybírat položku z daného sloupce. A teď v čem vidím problém: Vyberu si ve sloupci "umělec" třeba "The Beatles". V tomto okamžiku potřebuji, aby se mi sloupce napravo zaplnily alby Beatles a všemi skladbami. Zároveň sloupec "umělec" odjede z displaye doleva a zobrazí se sloupec "alba" (již pouze s alby Beatles). Otázkou nyní je, jestli se tohle dá provést v dostatečně krátkém čase, aby reakce GUI byla "rozumná".

V podstatě to znamená, že GUI (přes JavaScript) musí poslat jádru programu informaci, že jsem kliknul na "The Beatles" ve sloupečku "umělec". V Pythonu se spojím s sqlite databází a vytáhnu všechna alba a skladby od Beatles. Tyto dva seznamy potom pošlu GUI, které musí dané listy vykreslit. Potom se sloupce posunou doleva tak, aby se zobrazil sloupec "album". Je toto reálné? Vzhledem k tomu, že mířím na přenosná zařízení s nevalným výkonem, tak se bojím, jestli nejsem moc náročný. Na druhou stranu podobně fungující GUI mají některé přehrávače na Androidu psané v Javě a fungují obstojně rychle.

Co si vůbec o mém nápadu myslíte? Je to reálné nebo to mám rovnou vzdát?

8
Vývoj / Píšu vlastní audio přehrávač
« kdy: 31. 03. 2010, 23:28:20 »
Ahoj,

protože jsem nespokojený v podstatě se všemi přehrávači hudby, které existují, rozhodl jsem se vytvořit vlastní. Je to hodně velký úkol, vzhledem k tomu, jaký jsem programátor, ale člověk si musí dávat vysoké cíle.

Můj přehrávač má být pouze přehrávač, žádný nakupování hudby, ripování CD atd. Má mít knihovnu, dynamický playlisty, frontu na přehrávání a být pokud možno rozumně rychlý.

Kdy jsem se o to už pokusil pomocí PyGTK, ale ztroskotal jsem na tom, že jsem nedokázal v rozumné době vypsat do GUI obsah větší knihovny. Jinak jsem naprogramoval celkem rozumně prohledání adresáře s hudbou, nasypání do databáze, filtrování písniček z databáze a přehrávání (pomocí MPlayeru).

Nyní bych to zkusil rád pomocí PyQt4 a Phononu. V instalaci je nějaký jednoduchý ukázkový přehrávač, takže bych neměl mít problém se zprovozněním přehrávání. Chci se ale zeptat na pár věcí, u kterých si nejsem jistý, jak je udělat a jestli je vůbec moje představa reálná.

1) Jak na databázi? PyQt4 už přešel na Python 3, ale zdá se, že Pysqlite je zatím maximálně pro verzi 2.6. Našel jsem ale modul SqlAlchemy a ten funguje dobře. Navíc by mělo jít u větší kolekce nahradit SQLite PostgreSQL. Je tohle dobrá volba?

2) GUI přehrávače by mělo být zcela modulární poskládané z komponent. Komponenty by měly jít doinstalovat. Zkrátka něco na způsob toho, jak to umí foobar2000. Je mi jasný, že bude třeba vytvořit nějaký API, kterým si budou mezi sebou předávat informace (co vyfiltrovat, co je v playlistu, co hraje, co zobrazit atd.) Rád bych, aby mohli i další vývojáři doprogramovat své moduly do GUI. Ale hlavně vůbec nevím, jestli jde například prohledat nějaký adresář a načíst všechny *.py moduly. Tohle je věc, ve které nejvíc tápu. Navíc bych rád, aby program fungoval i ve Windows pomocí py2exe a tam už jsem úplně mimo.

3) Viděl bych to tak, že layout GUI bude definovaný pomocí XML souboru, něco podobnýho, jako to má Songbird.

4) Co na to říkáte? Je to blbost a mám se na to vykašlat nebo to má naději?

Stran: [1]