České vysoké učení technické v Praze Fakulta elektrotechnická
Bakalářská práce
Editor doplňujících informací v souborech formátu MP3 Marek Fiala
Vedoucí práce: Ing. Michal Šoch, Ph.D. T
T
Studijní program: Elektrotechnika a informatika, strukturovaný bakalářský Obor: Informatika a výpočetní technika Srpen 2007
Poděkování Na tomto místě bych rád poděkoval především vedoucímu mé bakalářské práce Ing. Michalovi Šochovi, Ph.D. za rady a připomínky v průběhu zpracování bakalářské práce.
Prohlášení Prohlašuji, že jsem svou bakalářskou práci vypracoval samostatně a použil jsem pouze podklady uvedené v přiloženém seznamu. Nemám závažný důvod proti užití tohoto školního díla ve smyslu §60 Zákona č. 121/2000 Sb., o právu autorském, o právech souvisejících s právem autorským a o změně některých zákonů (autorský zákon).
V Praze dne 15. 8. 2007
………………………………………
Abstrakt Tato bakalářská práce popisuje návrh a implementaci knihovny, která umožňuje načítat a zapisovat doplňující informace (tagy) v souborech formátu mp3. Dále popisuje aplikaci, která využívá výše zmíněnou knihovnu a umožňuje uživatelskou editaci tagů. Aplikace je zaměřena také na vytváření a přehrávání „karaoke textu“ písně. Takovýto text lze poté zobrazovat během přehrávání písně podobně jako titulky u filmu. Vše je realizováno v programovacím jazyce Java.
Abstract This bachelor’s thesis describes the realization and implementation of a library which allows reading and writing additional information (tags) into mp3 files. Next, the thesis provides a description of an application using the library and allowing user-friendly editing. The application also enables users to create and play synchronized lyrics – “karaoke texts”, which can be displayed when the song is playing, similarly to subtitles in films. The whole project is realized in the Java language.
Obsah Seznam obrázků ............................................................................................ 10 Seznam tabulek ............................................................................................. 10 Úvod ............................................................................................................... 11 1. Formát Mp3 ............................................................................................. 12 1.1. Historie ........................................................................................................... 12 1.2. Princip komprese ........................................................................................... 12 1.3. Vytvoření souboru mp3 ................................................................................. 13 1.4. Struktura souboru ........................................................................................... 14 2. Tag ID3 .................................................................................................... 15 2.1. Historie a vznik Tagu ..................................................................................... 15 2.2. Tag ID3v1 ...................................................................................................... 15 2.3. Tag ID3v1.1 ................................................................................................... 16 2.4. Vznik ID3v2 ................................................................................................... 17 2.5. Seznámení se s ID3v2 .................................................................................... 17 2.6. Struktura ID3v2.4 .......................................................................................... 18 2.7. Hlavička (Header) ID3v2.4 ............................................................................ 19 2.8. Rozšířená hlavička (Extended Header) ID3v2.4 ........................................... 19 2.9. Výplň (Padding) ID3v2.4 ............................................................................... 19 2.10. Patička (Footer) ID3v2.4 ........................................................................... 20 2.11. Datové rámce (Frames) ID3v2.4 ................................................................ 20 2.12. Rámec SYLT - „karaoke“ .......................................................................... 21 2.13. Srovnání ID3v1 a ID3v2 ............................................................................ 22 3. Analýza a návrh řešení .......................................................................... 23 3.1. Definice pojmů ............................................................................................... 23 3.2. Vymezení rozsahu a funkcí programu KaraokeEditor ................................... 23 3.3. Způsob uložení „karaoke textu“ ..................................................................... 25 3.4. Obecně k návrhu GUI .................................................................................... 25 3.5. Návrh GUI pro editaci tagů ............................................................................ 26 3.6. Návrh GUI pro vytváření karaoke ................................................................. 26 3.7. Návrh GUI pro přehrávač karaoke ................................................................. 26 3.8. Volba programovacího jazyka ....................................................................... 27 3.9. Volba vývojového prostředí ........................................................................... 27 4. Implementace ......................................................................................... 28 4.1. Struktura aplikace .......................................................................................... 28 4.2. Implementace knihovny pro práci s tagy ....................................................... 28 4.3. Ukázka práce knihovny s ID3v2 .................................................................... 31 4.4. Implementace grafického uživatelského rozhraní (GUI) ............................... 32 4.5. GUI Editoru tagů ............................................................................................ 32 4.6. GUI pro vytváření karaoke ............................................................................ 34 4.7. GUI pro přehrávání karaoke .......................................................................... 35 5. Testování ................................................................................................ 37 6. Závěr ........................................................................................................ 39 7. Seznam použité literatury ...................................................................... 41
TU
UT
TU
UT
TU
TU
UT
UT
TU
UT
TU
TU
UT
TU
TU
UT
TU
UT
TU
TU
TU
TU
TU
UT
UT
UT
UT
UT
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
UT
UT
UT
UT
UT
UT
UT
UT
UT
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
UT
UT
UT
UT
UT
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
UT
UT
TU
UT
UT
UT
UT
UT
UT
UT
UT
UT
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
UT
TU
TU
TU
UT
TU
UT
UT
UT
UT
UT
UT
UT
UT
UT
UT
UT
Příloha A Manuál k programu KaraokeEditor ................................................. 43 Příloha B Obsah přiloženého CD ................................................................... 48 UT
UT
9
Seznam obrázků TU
TU
TU
TU
TU
TU
TU
TU
TU
TU
Obr. 1 - Diagram komponent aplikace Karaoke Editor ..................................................24 Obr. 2 - Schéma hlavních tříd balíku mp3tagger.mp3 ...................................................29 Obr. 3 - GUI editoru tagů ...............................................................................................32 Obr. 4 - Diagram tříd - Tabulka pro editaci tagů ............................................................33 Obr. 5 - GUI Karaoke Editoru ........................................................................................34 Obr. 6 - GUI přehrávače karaoke ...................................................................................35 Obr. 7 - Diagram tříd - karaoke přehrávač .....................................................................36 Obr. 8 - Editor tagů .........................................................................................................44 Obr. 9 - Vytváření karaoke .............................................................................................46 Obr. 10 - Přehrávání karaoke .........................................................................................47 UT
UT
UT
UT
UT
UT
UT
UT
UT
UT
Seznam tabulek Tab. 1 - Porovnání různých bitrate .................................................................................14 Tab. 2 - Struktura hlavičky .............................................................................................14 Tab. 3 - Struktura položek ID3v1 ...................................................................................16 Tab. 4 - Struktura a velikost položek ID3v1.1 ...............................................................17 Tab. 5 - Struktura ID3v2 ................................................................................................18
TU
UT
TU
UT
TU
UT
TU
TU
UT
UT
10
Úvod V dnešní době se jen obtížně hledá někdo, kdo nemá ve svém počítači žádné soubory typu mp3. Průměrně se počet těchto souborů u běžného uživatele pohybuje v řádu několika stovek. V takovém množství souborů není jednoduché nejen udržovat pořádek, ale především vyhledat potřebnou skladbu.
Většina
hudebních
přehrávačů
umožňuje
vyhledávat
pomocí
doprovodných informací obsažených přímo v souboru - v tzv. tagu. Tag poskytuje možnost obohatit hudební soubor o textové informace jako je např. název interpreta, skladby, alba... Bohužel velké množství „empétrojek“ nemá tagy vyplněné, proto je pak problém danou píseň v počítači najít. Pokud však budou Vaše soubory obohacené o informace v tagu, stane se vyhledávání Vaší oblíbené písně hračkou. Prvním cílem této práce tedy je vytvořit funkční aplikaci, která umožní rychle a snadno editovat tagy v souborech mp3. Poměrně velká část lidí vnímá u písní pouze hudbu a textu si ani nevšimne. Některé texty písní stojí za to si poslechnout (přečíst) a zamyslet se nad nimi. Text písně se vnímá mnohem snáz, pokud ho vidíte napsaný před sebou. Druhým cílem této práce samozřejmě není donutit posluchače, aby začali přemýšlet nad texty písní - to by bylo jistě velmi naivní. Cílem však je vytvořit
aplikaci,
která
bude
umožňovat
vytvoření
a
zobrazení
synchronizovaného textu - „karaoke textu“, což je text, který je plynule zobrazován při přehrávání písně. Nejprve bude zapotřebí navrhnout a naimplementovat knihovnu pro práci s tagy v souborech formátu mp3. Tag existuje ve dvou verzích a to ID3v1 a ID3v2. První verzi tagu bude knihovna podporovat kompletně, druhá verze je však mnohem komplikovanější a knihovna by tedy měla umožňovat zpracovávat alespoň tu část, která je pro běžného uživatele důležitá, a kterou opravdu využije. Práce se bude také zabývat vývojem aplikace postavené na výše zmíněné knihovně. Aplikaci lze rozdělit na tři samostatné celky. Tím prvním bude rozhraní pro práci s tagy. Druhým rozhraní pro vytváření „karaoke“. A poslední částí programu bude jednoduchý přehrávač mp3, který bude umět zobrazovat výše zmíněný „karaoke text“.
11
1. Formát Mp3 1.1.
Historie
Formát MP3 je pouze jedním z řady Mpeg formátů. Původně byl formát MPEG využíván pro vysokou kompresi videa, ale používá se taktéž ke kompresi zvuku. MPEG-1 Audio Layer 3 - známý pod zkratkou Mp3, je nejpopulárnější formát ztrátové komprese zvukových souborů, který umožňuje několikanásobně zmenšit objem dat při zachování výsledné kvality zvuku. O vývoj formátu MP3 se zasloužil německý vědec Karlheinz Brandenburg a jeho tým. Jejich první softwarový kodér se objevil v roce 1994 a o půl roku později se začaly na internetu objevovat první mp3 soubory. S pomocí programů jako WinAmp a Napster bylo velmi snadné takovéto soubory přehrávat, vytvářet a sdílet. To byl hlavní důvod úspěchu tohoto formátu.
1.2.
Princip komprese
Při ukládání dat z audio CD je zapotřebí zhruba 1400Kbit/s. (44100 vzorků za sekundu, které se ukládají do 16bitů a to celé vynásobeno dvěma - pro stereo je nutné uložit nezávisle oba kanály) [5] . Při použití Mp3 kodéru se T
T
datový tok změní přibližně v poměru 1:12 a to při zachování kvality zvuku. Jak je to možné? Kompresní algoritmy jsou založeny na tzv. psychoakustickém modelu, který využívá toho, že sluchové ústrojí člověka není dokonalé. Tedy odstraní takové zvuky, které člověk není schopen slyšet nebo si je neuvědomuje.
Psychoakustický
model
využívá
principů
časového
a frekvenčního maskování.
1.2.1. Časové maskování (Temporal masking) Časové maskování využívá toho, že lidské ucho není schopno bezprostředně před a po silném tónu slyšet jiné slabší tóny. Funguje to i naopak - tzn. ihned po absolutním tichu nejsme schopni na krátkou chvíli nic
12
slyšet. Tato doba po „zahlušení“ je paradoxně delší, než doba vzpamatování ucha po „přehlušení“.
1.2.2. Frekvenční maskování (Frequency masking) Frekvenční maskování funguje podobně jako časové. Pokud zazní silný tón o frekvenci např. 5000Hz a slabší tón o frekvenci 6000Hz, lidské ucho není schopné druhý tón rozpoznat. Tudíž můžeme takovéto tóny odstranit a snížit tak datový tok.
1.2.3. Joint Stereo Algoritmus využívá také redundance informací ve stereo módu. Lidské ucho není schopné lokalizovat zdroj zvuku o velmi vysokých a nízkých frekvencích. V Mp3 se tedy nekóduje každý kanál zvlášť, ale kóduje se jako tzv. Joint Stereo ve kterém kodér vytvoří rozdílový a součtový kanál. To má za následek snížení datového toku na úkor částečné ztráty sterea.
1.3.
Vytvoření souboru mp3
K vytvoření mp3 jsou potřeba dva programy: •
Grabovač (Grabber) - např. AudioGrabber
•
Mp3 kodér (Mp3 encoder)
Pomocí grabovače zkopírujeme audio stopu z hudebního CD na harddisk PC ve formě WAV souborů. Při grabování nedochází ke ztrátě kvality a soubor není nijak komprimován, takže jedno album v tomto formátu bude zabírat na disku téměř 650MB. Následně převedeme WAV soubor pomocí kodéru do Mp3. Při převodu lze nastavit mnoho parametrů, které ovlivňují jak výstupní velikost souboru, tak výslednou kvalitu. Asi nejdůležitějším parametrem je bitrate, který udává množství dat, které jsou potřebné na jednu sekundu zaznamenaného zvuku. (Existuje i variabilní bitrate - VBR, ve kterém se bitrate mění dynamicky podle potřeby v průběhu celé písně). Pro kvalitní poslech lze jen doporučit bitrate 128Kbit/s a výš. Při 256Kbit/s není schopen ani odborník rozlišit originál od mp3. Dále lze nastavit parametry 13
jako vzorkovaní frekvence (standardně 44100Hz), velikost vzorku (16 bitů), stereo mód (Joint Stereo). Přehled různých nastavení kodéru je uveden v Tab.1. T
T
Tab. 1 - Porovnání různých bitrate
1.4.
Struktura souboru
Soubor mp3 se dělí na rámce (frames). Každý rámec obsahuje dvě části - hlavičku a data. Rámce nemají konstantní délku. Konec rámce se rozpozná podle začátku hlavičky rámce následujícího. Při použití konstantního bitrate jsou hlavičky rámců v celém souboru totožné. Hlavička se skládá ze 4 bytů [6] . Prvních jedenáct bitů (sync header) je T
T
vždy nastaveno na „1“ a určuje tak začátek hlavičky. Další bity hlavičky nesou informace o kódování zvuku viz Tab. 2. T
T
Tab. 2 - Struktura hlavičky
14
2. Tag ID3 2.1.
Historie a vznik Tagu
S rostoucím počtem souborů mp3 se objevil nový problém. Jak v takovém množství souborů udržovat pořádek a jakým způsobem vyhledávat. Název souboru, který by obsahoval název interpreta, skladby, rok vydání a název alba určitě nepatří mezi nejšťastnější řešení. Eric Kemp alias NamkraD v roce 1996 navrhl pevnou strukturu dat, která se připojila na konec souboru mp3. Tato struktura, které se říká tag ID3, představuje způsob jak přiložit k souboru doprovodné textové informace. Naprostá většina přehrávačů hudby začala během krátké doby ID3 tagy podporovat. Díky tomu můžeme hudební soubory velmi snadno vyhledávat nejen podle názvu souboru, ale i podle názvu interpreta, skladby nebo alba. Tag navržený Ericem Kempem (později označovaný jako ID3v1) byl za krátkou chvíli rozšířen o číslo CD stopy. Tato verze je označovaná jako ID3v1.1. Obě verze se velmi dlouho používaly a v mnoha případech se ještě dodnes používají. Díky nemožnosti rozšíření a malé flexibilitě však vznikla další verze - ID3v2, která je již mnohem sofistikovanější a odstraňuje nedostatky předchozích verzí. ID3 tagy jsou určeny pro použití v MPEG souborech - zvláště pak ve formátu mp3. Obecně je lze však použít u jakéhokoliv typu souboru.
2.2.
Tag ID3v1
Tag je umístěn až na samém konci audio souboru a má pevnou délku 128 bajtů. Umístění na konci souboru bylo pravděpodobně zvoleno kvůli kompatibilitě se staršími přehrávači, které s tagy neuměly pracovat. Toto umístění má však jednu obrovskou nevýhodu a to při streamovanání hudby, kdy se informace o skladbě stáhnou až jako poslední.
15
První tři bajty tagu obsahují vždy slovo „TAG“, které informuje přehrávač, že od tohoto místa již neobsahuje soubor žádná audio data, ale tag. Jednotlivé položky mají konstantní délku. Např. pro název skladby je vyhrazeno právě 30 znaků. Pokud je název skladby delší, budou přebývající znaky oříznuty (neexistuje možnost jak uložit delší údaj). Pokud však bude název skladby obsahovat méně než 30 znaků, musí se zbývající znaky vyplnit binární nulou. Přehrávače považují binární nulu jako konec položky. Struktura a délka jednotlivých položek tagu je uvedena v Tab. 3 . T
TT
T
Údaj "TAG" Název skladby Jméno interpreta Název alba Rok vydání Komentář Žánr
Délka 3 znaky (bajty) 30 znaků (bajtů) 30 znaků (bajtů) 30 znaků (bajtů) 4 znaky (bajty) 30 znaků (bajtů) 1 bajt
Pozice 0-2 3 - 32 33 - 62 63 - 92 93 - 96 97 - 126 127
Tab. 3 - Struktura položek ID3v1
Jak uložit žánr skladby (čili textovou informaci např. Rock, Blues) do jediného bajtu? Programy pro vytváření i čtení tagů obsahují stejnou kopii seznamu žánrů, kde každé položce odpovídá jedno číslo, které se ukládá do tagu. Původně byl vytvořen seznam čítající asi 80 žánrů, který je v současné době rozšířen téměř na dvojnásobek.
2.3.
Tag ID3v1.1
Položky v ID3v1 měly konstantní velikost, takže tag nebylo možné rozšířit o další informace. Avšak Michael Mutschler vymyslel chytrý způsob jak ID3v1 rozšířit o číslo stopy CD a přitom zachovat kompatibilitu se starším softwarem který uměl pracovat pouze s ID3v1. Toto rozšíření se označuje jako ID3v1.1. Struktura je uvedena v Tab. 4 . T
T
Standard říká, že nevyužité bajty ve všech položkách mají být vyplněny binární hodnotou nula, což znamená, že veškerý software zpracovávající tagy
16
přestane položku číst v okamžiku, kdy dojde k binární nule, protože předpokládá, že po ní už nic smysluplného nenásleduje. Michael Mutschler tedy zkrátil položku komentář ze 30 na 28 bajtů. 29. bajt je nastaven vždy na hodnotu binární nuly a 30. bajt obsahuje číslo stopy. Software, který umí pracovat pouze s ID3v1 považuje 29. bajt, který má hodnotu binární nula jako konec komentáře a přejde tedy ke čtení další položky. Avšak software pracující s ID3v1.1 zkontroluje, zda 30. bajt komentáře obsahuje nějaké číslo a to považuje za číslo CD stopy. Údaj "TAG" Název skladby Jméno interpreta Název alba Rok vydání Komentář Číslo stopy Žánr
Délka 3 znaky (bajty) 30 znaků (bajtů) 30 znaků (bajtů) 30 znaků (bajtů) 4 znaky (bajty) 28 znaků (bajtů) 2 bajty 1 bajt
Pozice 0-2 3 - 32 33 - 62 63 - 92 93 - 96 97 - 124 125 - 126 127
Tab. 4 - Struktura a velikost položek ID3v1.1
2.4.
Vznik ID3v2
První verze ID3 obsahovala několik nedostatků. Především pevně daná struktura a konstantní délka položek byla značně omezující. Neexistovala možnost jak rozšířit tag o další informace (tedy vyjma přidání čísla stopy CD). Dalším nedostatkem bylo právě umístění tagu na konec souboru. Pří streamování hudby tedy přišly informace o skladbě až po odehrání celé písně. Tyto nedostatky vedly ke snaze o vývoj novější a mnohem flexibilnější struktury, která by umožňovala připojit k audio souboru další typy informací.
2.5.
Seznámení se s ID3v2
ID3v2 se tedy dá přirovnat k jakémusi kontejneru, který obsahuje libovolný počet rámců, které mohou mít různou délku (Pozor, s rámcem v mp3 souboru to nemá nic společného). Každý rámec obsahuje určitý druh informace, jako například interpreta, název skladby, nebo text k písni. Dokonce může rámec
17
obsahovat i obrázek nebo videoklip. Tedy v podstatě cokoliv. Je zde implementována podpora kódování Unicode, takže není problém uložit text písně i v původním jazyce. Tag ID3v2 tedy nemá omezenou délku a ani umístění tagu v souboru není pevně dáno. Přesto je tag umístěn v drtivé většině případů hned na začátku souboru, kvůli streamování. Jedinou nevýhodou ID3v2 je relativně složité zpracování a implementace, protože oproti předchozí verzi zde není pevně dáno ani pořadí ani délka jednotlivých položek, stejně tak umístění tagu. Postupně se objevují další typy rámců, takže software musí být schopný přečíst a zpracovat rámce, které zná a ignorovat a přeskočit ty, které nezná. Tag ID3v2 prošel již několika verzemi. Nejnovější je ID3v2.4, jejíž stručný popis je na následujících stránkách.
2.6.
Struktura ID3v2.4
Uspořádání jednotlivých částí tagu je uvedeno v Tab. 5 . Tag musí být T
T
uložen v souboru jako celek a jednotlivé části na sebe musí bezprostředně navazovat - tzn., že mezi jednotlivými částmi tagu se nesmí objevit audio data, ani nic jiného. Tag využívá ukládání bajtů známé jako „big endian“ - nejvýznamější bajt je uveden na prvním místě. V tagu se nikdy nemůže vyskytnout patička a výplň zároveň. Hlavička (10 bajtů) Rozšířená hlavička proměnná délka, volitelně Rámec 1 - proměnná délka Rámec 2 - proměnná délka --Rámec n - proměnná délka Výplň proměnná délka, volitelně Patička (10 bajtů) volitelně Tab. 5 - Struktura ID3v2
18
Následuje popis jednotlivých částí ID3v2. Jedná se pouze o základní informace, jelikož celá specifikace je velmi rozsáhlá [4] . T
2.7.
T
Hlavička (Header) ID3v2.4
Hlavička je první částí tagu a její délka je vždy 10 bajtů. Struktura je následující: ID3v2 ID3v2 ID3v2 ID3v2
identifikátor "ID3" verze $04 00 flagy %abcd0000 velikost - 4 bajty
První 3 bajty hlavičky obsahují „ID3“, což je jakýsi identifikátor tagu. Následující dva bajty obsahují číslo verze a číslo revize. Verze jsou vždy zpětně kompatibilní. Pokud tedy software, který umí pracovat s verzí ID3v2.3 nalezne ID3v2.4, jednoduše celý tag přeskočí. Další byte obsahuje flagy, které informují např. o přítomnosti rozšířené hlavičky nebo patičky. Zbývající 4 bajty nesou velikost celého tagu.
2.8.
Rozšířená hlavička (Extended Header) ID3v2.4
Rozšířená hlavička obsahuje informace, které nejsou nezbytně nutné k přečtení tagu, proto se jedná o volitelnou položku tagu. Struktura je následující:
2.9.
Velikost rozšířené hlavičky
4 bajty
Počet bajtů flagů
$01
Rozšiřující flagy
$xx
Výplň (Padding) ID3v2.4
Výplň je nepovinnou součástí tagu a je umístěna na konci za posledním rámcem. Může obsahovat pouze nulové bajty. Jaký to má význam? Pokud bychom chtěli změnit např. jméno skladby a nový název by byl jen
19
o jeden bajt větší, musel by se přepsat celý soubor. Proto se na konec tagu vkládá určitý počet nulových bajtů jako „rezerva“ pro další rámce nebo rozšíření těch stávajících. Pokud tag obsahuje výplň, už nesmí obsahovat patičku.
2.10.
Patička (Footer) ID3v2.4
Patička je nepovinnou součástí tagu a slouží pouze ke zvýšení rychlosti při prohledávání souboru od konce. Patička je vlastně kopií hlavičky s jedinou výjimkou a to identifikátorem. Ten je oproti hlavičce zrcadlově obrácen, čili obsahuje „3ID“. Vzhledem k tomu, že je tag v drtivé většině případů umístěn na začátku souboru, patička se většinou v tagu neobjevuje.
2.11.
Datové rámce (Frames) ID3v2.4
Datové rámce jsou nejdůležitější součástí tagu, protože obsahují požadované informace o skladbě. Pro každý typ informace, kterou chceme do tagu uložit, je vyhrazen jeden rámec. Rámec se skládá ze dvou částí a to z hlavičky a samotných dat, které nesou informace. Hlavička rámce se skládá z deseti bajtů. Její struktura je následující: ID rámce $xx xx xx xx (čtyři znaky) Velikost 4 bajty Flagy $xx xx
ID rámce může obsahovat velká písmena A - Z nebo číslice 0 - 9. ID rámce
nesmí
začínat
písmeny
X,
Y
a
Z,
které
jsou
vyhrazeny
pro experimentální použití. Následuje velikost rámce ve které není započtena velikost hlavičky rámce - tzn. celková velikost rámce je o 10 bajtů větší. Následují dva bajty obsahující flagy. Podle typu rámce může hlavička obsahovat ještě další položky. Podrobný popis naleznete v [4] . T
T
ID3v2.4 obsahuje přes 80 různých rámců, které obsahují všechny možné druhy informací. Od základních textových, přes obrázky, synchronizovaný text, až po nastavení ekvalizéru nebo hlasitosti. Seznam rámců není konečný a v každé další verzi se objevují nové rámce. Specifikace říká, že pokud
20
software, který tag zpracovává, narazí na rámec jenž nezná, tak ho přeskočí. To znamená, že pokud do tagu vložíme nějaký svůj nový rámec, přehrávačům to nezpůsobí při čtení žádné problémy. Zde je vidět obrovská pružnost a možnosti při rozšiřování tagu ID3v2. Seznam ID nejdůležitějších rámců: TIT2 - název skladby TPE1 - interpret TALB - název alba TYER - rok vydání TCON - komentář USLT - text k písni SYLT - synchronizovaný text - „karaoke“
2.12.
Rámec SYLT - „karaoke“
Velká část aplikace slouží pro vytváření a zobrazování „karaoke“, proto je zde uveden popis odpovídajícího rámce. Struktura hlavičky je následující: ID rámce: Velikost Flagy Kódování Jazyk Formát časových značek Typ obsahu Popis obsahu
"SYLT" 4 bajty $xx xx $xx $xx xx xx $xx $xx text končící $00
Časové značky obsahují absolutní čas, čili čas od začátku spuštění skladby, a mohou být dvojího druhu: $01 - číslo MPEG rámce, velikost 4 bajty $02 - čas v milisekundách, velikost 4 bajty
21
Po hlavičce následují jednotlivé synchronizované úseky textu. Nejprve je uložen text, který je zakončený binární nulou. Poté následuje časová značka (Time Stamp) určující, kdy je daný text aktuální. Jednotlivé časové značky by měli jít chronologicky po sobě.
Úsek textu Ukončení textu Časová značka
$00 $xx xx xx xx
Úsek synchronizovaného textu může vypadat například takto: Toto $00 $00 $00 $10 $55 Je
T
T
T
kousek $00 $00 $00 $20 $99 T
synchronizovaného $00 $00 $00 $30 $88 textu $00 $00 $00 $40 $55
T
T
2.13.
T
T
Srovnání ID3v1 a ID3v2
Obě verze mají své výhody a nevýhody. ID3v1 poskytuje pouze základní informace, které však určité skupině uživatelů naprosto stačí. Neexistuje žádná možnost dalšího rozšíření. Oproti tomu ID3v2 umožňuje do souboru mp3 uložit prakticky jakákoliv data s možností budoucího rozšiřování o nové položky. Jedinou nevýhodou ID3v2 je relativně složitější zpracování a implementace. Z uživatelského hlediska však tato nevýhoda nemá žádný význam. Co se týká velikosti tagu v souboru - ve většině případů je velikost tagu ID3v2 o něco menší než ID3v1 (tedy za předpokladu uchování stejných informací). To je dáno tím, že velikost položek v ID3v1 je pevně dána. Velikostí tagu se však ve většině případů nemusíme zabývat, protože v porovnání s velikostí souboru mp3 (řádově jednotky MB) nemá velikost tagu (desítky bajtů) prakticky žádný význam.
22
3. Analýza a návrh řešení 3.1.
Definice pojmů
V tomto odstavci je definováno několik pojmů, u kterých by mohlo dojít k nesrovnalostem. •
„karaoke“ text - neboli synchronizovaný text, je text, který je zobrazován v průběhu přehrávání písně. Podobně jako titulky u filmu.
•
„synchronizovat text“ - ke každému úseku textu přiřadit časový údaj, kdy má být text zobrazen
•
KaraokeEditor - název výsledného programu
•
ID3v2 - druhá verze tagu. Pokud není uvedeno jinak, je myšlena aktuální verze ID3v2.4
•
GUI - grafické uživatelské rozhraní
3.2.
Vymezení rozsahu a funkcí programu KaraokeEditor
První částí práce je knihovna pro čtení a zápis tagů. Existují dva typy tagů: ID3v1 a ID3v2. Knihovna musí umět pracovat kompletně s celým tagem ID3v1. ID3v2 se dále dělí na několik verzí - v současné době (srpen 2007) je nejnovější ID3v2.4. Knihovna by měla umět pracovat s „rozumnou“ částí ID3v2.4 (označeno dále pouze jako ID3v2). Vzhledem k rozsahu ID3v2 by bylo vytvoření knihovny, která umí kompletně zpracovávat ID3v2, nad rámec této práce. Dokumentace popisuje přes 80 datových rámců, přičemž každý má své specifické vlastnosti a v naprosté většině případů se jich využívá pouze kolem deseti. Pro každý rámec by musel být napsán specifický kód, přičemž by se ve většině případů jednalo pouze o rutinní práci. Pojmem „rozumná“ část znamená vytvoření tagu a čtení či zápis nejpoužívanějších rámců. Cílem je, aby výsledná aplikace dokázala zpracovávat pokud možno co největší procento tagů. 23
Druhou částí práce je aplikace sloužící k editaci tagů, založená na výše zmíněné knihovně. Cílem je vytvořit snadno ovladatelné a přehledné grafické rozhraní s využitím knihovny Java Swing. Tagy bude možno editovat po jednom souboru, ale také hromadně. Dalším požadavkem na aplikaci bude vytvoření názvu souboru podle dat z tagu a také opačný postup, kde bude název souboru mp3 obsahovat určité údaje a program z nich vytvoří data pro tag. Další částí aplikace bude rozhraní pro vytváření „karaoke textu“. Karaoke text nebo-li synchronizovaný text písně bude uložen přímo v souboru mp3. Dalším požadavkem je, aby byl zobrazitelný i v běžných přehrávačích hudby jako je Windows Media Player nebo populární WinAmp. K některým přehrávačům se bude muset doinstalovat příslušný plug-in. A konečně poslední částí programu bude jednoduchý přehrávač mp3, který bude umožňovat základní operace při přehrávání hudby, ale především musí umět zobrazovat „karaoke text“ a to v nějaké přijatelné grafické podobě. Aplikace bude využívat standardní knihovny jazyka Java (java.io, java.utils, javax.swing) + pro přehrávání mp3 souborů bude použito knihovny JLayer 1.0 - www.javazoom.net . HTU
UTH
Hlavní části aplikace jsou zobrazeny na Obr. 1 . T
T
Obr. 1 - Diagram komponent aplikace Karaoke Editor
24
3.3.
Způsob uložení „karaoke textu“
Způsobů jak uložit „karaoke“ existuje více. Buď použít již existující formát, nebo navrhnout a naimplementovat nový způsob uložení „karaoke“. Mezi existující formáty patří Lyrics3 a ID3v2. Lyrics3 je v podstatě ID3v1 s několika rozšířeními a s možností uložit klasický a synchronizovaný text písně. Avšak oproti ID3v2 je mnohem méně rozšířený a s podporou v hudebních přehrávačích je to podobné. Vzhledem
k výše
uvedeným
požadavkům
(zobrazení
v běžných
přehrávačích) se jeví jako nejvýhodnější uložení „karaoke“ do tagu ID3v2. Za zmínku stojí také délka úseku synchronizovaného textu. V původním návrhu bylo počítáno s délkou jednoho slova. Avšak i u pomalých písní byl problém s návrhem GUI tak, aby byl uživatel schopen na jedno přehrání přiřadit ke každému slovu čas od začátku písně (např. stisknutím nějaké klávesy nebo kliknutím myši). Nakonec bude jako úsek pro synchronizaci zvolen celý řádek textu, což umožňuje mnohem snadnější a pohodlnější vytváření „karaoke textů“, za cenu snížení efektu (obarvování textu po slovech by působilo lépe)
3.4.
Obecně k návrhu GUI
Při návrhu GUI bude brán zřetel především na jednoduchost, přehlednost a snadné ovládání aplikace. Ovládací prvky budou rozmístěny podle standardních
zvyklostí.
Počet
ovládacích
prvků
bude
omezen
na
ty
nejdůležitější (složitost odradí velké procento uživatelů) pokud možno ne za cenu snížení funkčnosti aplikace. Panel hlavního okna aplikace bude rozdělen na tři záložky: •
Karaoke přehrávač
•
Karaoke editor
•
Editor Tagů
25
3.5.
Návrh GUI pro editaci tagů
Jak napovídá název, tato část bude sloužit pro editaci tagů. Základním požadavkem na GUI je snadná a rychlá editace tagů a to jak po jednom souboru, tak hromadně. Záložka tedy bude rozdělena vodorovně na dva panely. Horní
panel
bude
obsahovat
ovládací
prvky
pro
hromadnou
editaci
tagů - např. přejmenování interpreta pro celé album apod. V dolním panelu budou zobrazeny tagy v aktuální otevřené složce pro editaci.
3.6.
Návrh GUI pro vytváření karaoke
V levé části bude zobrazen text písně. Vpravo bude zobrazena aktuální nápověda. Pod nápovědou bude okno pro editaci již vytvořeného karaoke. Uprostřed budou tlačítka pro vytváření karaoke. Postup při vytváření karaoke bude následující: uživatel nejprve otevře soubor mp3, u kterého chce vytvořit karaoke. Do okna pro text vloží text písně a poté stiskne tlačítko start - spustí se píseň. Vždy když uslyší v písni začátek nového řádku textu písně, stiskne tlačítko a řádek se obarví. Takto projde celou píseň. Nakonec se karaoke uloží do tagu přímo do mp3.
3.7.
Návrh GUI pro přehrávač karaoke
Zde bude jednoduchý přehrávač souborů mp3 (Základní tlačítka pro ovládání přehrávání + zobrazení průběhu přehrávání a čas do konce skladby). V pravé části bude zobrazený text písně. Pod přehrávačem mp3 panel zobrazující „karaoke text“. Text se bude plynule posouvat v průběhu přehrávání. Bude zobrazeno cca 5 řádků textu s tím, že aktuální řádek bude zobrazen odlišnou barvou.
26
3.8.
Volba programovacího jazyka
Pro vytvoření knihovny a aplikace je zvolen objektově orientovaný programovací jazyk Java od Sun Microsystems. Patří mezi nejrozšířenější programovací jazyky současnosti a to především díky své přenositelnosti a nezávislosti na platformě, které je dosaženo tím, že jazyk není kompilovaný ale interpretovaný. To znamená, že zdrojový kód programu není překladačem přeložen do strojového jazyka počítače, ale do pseudojazyka nazývaného bajtkód (byte-code), který je pak při spouštění programu interpretován JVM (Java Virtual Machine). Důvodů pro volbu tohoto jazyka je hned několik. Především již zmíněná nezávislost
na
platformě,
respektive
operačním
systému
a
snadná
přenositelnost do webové podoby (Java Applet popřípadě Java Web Start). Java obsahuje výbornou knihovnu pro vytváření grafických aplikací - Swing. Další výhodou je např. oproti C++ odstranění určitých konstrukcí (ukazatele, správa paměti, příkaz goto), které způsobovaly programátorům problémy a vedly k chybám, které se velmi těžce hledali a odstraňovali. Jazyk však oproti C++ obsahuje také řadu nových vlastností - například sběrač neplatných objektů - Garbage Collector, kontrola datových typů a rozsahu indexů polí za běhu programu. To vše za cenu určitého zpomalení běhu aplikace. Avšak vzhledem k povaze této aplikace (nebude pracovat s velkým množstvím dat v reálném čase) je tento nedostatek zanedbatelný.
3.9.
Volba vývojového prostředí
Pro implementaci bylo zvoleno open source vývojové prostředí NetBeans IDE - www.netbeans.org . Toto IDE velice usnadňuje a urychluje vývoj aplikací HTU
UTH
a to především díky obrovskému množství užitečných funkcí a snadnému přehlednému ovládání.
27
4. Implementace 4.1.
Struktura aplikace
Zdrojový kód se skládá ze 4 balíků: mp3tagger.mp3 - tento balík obsahuje třídy, které slouží pro práci s adresáři a soubory typu *.mp3 mp3tagger.tag - slouží pro práci s tagy ID3v2 a ID3v1. Spolu s balíkem mp3tagger.mp3 realizují knihovnu pro práci s tagy mp3tagger.gui - obsahuje veškeré GUI aplikace, tedy editoru tagů, karaoke přehrávače a karaoke editoru mp3tagger.others - v tomto balíku se nachází různé pomocné třídy, které využívají všechny části aplikace
4.2.
Implementace knihovny pro práci s tagy
Jak již bylo uvedeno výše, knihovna pro práci s tagy se skládá ze dvou balíků mp3tagger.mp3 a mp3tagger.tag . T
T
T
T
První balík slouží pro práci se soubory mp3. Základem jsou dvě třídy Mp3FileTagv1 a Mp3FileTagv2 , které představují soubor mp3 s tagem
T
T
T
T
verze 1 nebo 2. Obě třídy jsou potomkem třídy java.io.File , která slouží T
T
pro práci se soubory. Třídy obsahují metody pro vytvoření, zápis a čtení do souboru. Umožňují také zápis a čtení jednotlivých položek tagu. Obsahují metody pro modifikaci názvu souboru. Obě třídy dále implementují rozhraní Mp3File , které obsahuje metody pro T
T
čtení a zápis tagu do souboru. Účel rozhraní Mp3File je zřejmý: vytvořit T
T
společné rozhraní a v němž pracovat se souborem, aniž bychom se museli zajímat o jakou verzi tagu je soubor obohacen (Základní idea OOP polymorfismus).
28
Další důležitou třídou je Mp3Dir , která představuje adresář obsahující T
T
soubory s tagy k editaci. Třída obsahuje pole souborů v adresáři a umožňuje k nim jednotlivě přistupovat. Postup při čtení tagu je následující: nejprve se vytvoří instance objektu Mp3FileTagv2 . Poté se zjistí, zda soubor obsahuje ID3v2. Pokud ne, vytvoří
T
T
se instance Mp3FileTagv1.
Upřednostňuje se tedy druhá verze tagu.
T
Knihovna umí samozřejmě také vytvořit tag v souboru. Tag se vytvoří ve verzi ID3v2.3 . Nepoužije se tedy nejnovější verze ID3v2.4, protože např. WinAmp T
(ver. 2.8 a nižší) umí číst pouze tagy ID3v2.3. Celé schéma balíku mp3tagger.mp3 by měl ujasnit následující diagram T
T
tříd (Obr. 2), ve kterém jsou zobrazeny nejdůležitější atributy a metody tříd.
Obr. 2 - Schéma hlavních tříd balíku mp3tagger.mp3
Balík mp3tagger.mp3 obsahuje ještě několik pomocných tříd. Např. třída T
T
FileName , která slouží pro modifikaci názvu souboru. Dále třídy výjimek
T
T
NoFilesFoundException a DirNotFoundException.
T
T
T
Význam těchto
výjimek je patrný z jejich názvu.
29
Druhý balík - mp3tagger.tag - je množina tříd, které implementují T
T
specifikace ID3v1 a ID3v2. Nejdůležitější je třída Tag , která slouží pouze jako T
T
datové úložiště informací tagů. Využívají ji tedy obě verze tagu. Třída uchovává tyto informace: název souboru, interpreta, název skladby, album, rok, komentář, číslo skladby a žánr. Třída obsahuje dále např. seznam žánrů pro ID3v1 (ve verzi dva již není uložen žánr jako jeden byte, ale je uložen název žánru jako text) a několik pomocných metod pro převod informací z tagu na proud bajtů. Další třídy balíku mp3tagger.tag jsou výhradně pro ID3v2. T
ID3v2Frame - představuje datový rámec. Třída obsahuje data rámce,
T
hlavičku, nastavení jednotlivých flagů, velikost a pozici v souboru. Umožňuje převádět informace na proud bajtů a zpět. ID3v2Header - hlavička tagu ID3v2. Obsahuje jednotlivé flagy, velikost
T
tagu a informace o verzi a revizi tagu. ID3v2ExtHeader - je rozšířená hlavička tagu. Dále stojí za zmínku třídy SynchsafeInt a NoSynchsafeInt . T
T
T
T
Vzhledem k tomu, že začátek rámce audio dat je rozpoznáván podle bajtu nastaveného na $FF, nemůže se nikde v tagu tento bajt vyskytnout. Velikost rámce jsou 4 bajty a ani jeden bajt nesmí být tedy nastaven na $FF. Tento problém řeší tzv. SynchSafe integer, ve kterém je vždy nejvyšší bit nastavený na „0“. Ze 32-bitového integeru lze tedy využít pouze 28 bitů. Výše zmíněné třídy slouží pro převod integeru na SynchSafe integer a obráceně. Př.
255(%11111111)
T
je
zakódováno
jako
383(%00000001
01111111). Třída KaraokeSync představuje jeden úsek synchronizovaného textu
T
(karaoke). Obsahuje část textu, terminátor (binární 0) a čas od začátku skladby v milisekundách. Data pro karaoke pak představuje ArrayList objektů třídy KaraokeSync.
30
4.3.
Ukázka práce knihovny s ID3v2
T
T
Na následujících řádcích je popis a ukázka kódu, který načte název skladby ze souboru pokus.mp3. Nejprve se vytvoří objekt Mp3FileTagv2, T
kterému je v konstruktoru předán parametr typu string , jenž obsahuje cestu T
T
T
k souboru. Pomocí metody getTag() se získá odkaz na tag a pomocí T
T
getTitle() název skladby, který se vypíše na standardní výstup. Celý kód
T
T
musí být obklopen klauzulí try-catch , a odchytit výjimku IOException, T
T
protože se přistupuje k souboru na disku. try{
T
T
T
T
Mp3FileTagv2 f = new Mp3FileTagv2("c:\\test.mp3"); Tag t = f.getTag(); System.out.println(t.getTitle());
}catch (IOException ex) {
T
T
System.out.println("Soubor nelze otevřít");
}
T
Další úsek kódu ukazuje zápis názvu alba do souboru test.mp3. Stejně jako v předchozím příkladě se vytvoří objekt Mp3FileTagv2 a získá odkaz T
na
tag.
Pomocí
metody
setAlbum()
se
nastaví
nový
název
alba
a writeTag() zapíše informace do souboru. Opět se musí zachytávat výjimka typu IOException.
T
try{ Mp3FileTagv2 f = new Mp3FileTagv2("c:\\test.mp3"); Tag t = f.getTag(); t.setAlbum("Nove album"); f.writeTag(); } catch (IOException ex) { System.out.println("Soubor nelze otevřít"); }
31
4.4.
Implementace grafického uživatelského rozhraní (GUI)
Všechny části grafického uživatelského rozhraní aplikace jsou vytvořeny pomocí knihovny Swing, která rozšiřuje původní knihovnu AWT. Narozdíl od AWT, která využívala grafické komponenty operačního systému, má Swing své vlastní komponenty. Aplikace tedy vypadá na různých operačních systémech úplně stejně. Swing je mnohem lépe navržen a poskytuje větší flexibilitu a podporuje nejnovější technologie. Složitější grafické komponenty využívají koncept Model 1. Základním principem je oddělení komponenty pro zobrazení dat od jejich reprezentace. Všechny třídy GUI jsou obsažené v balíku mp3tagger.gui a plně T
T
využívají knihovnu pro práci s tagy popsanou výše. Základem celého GUI je jediná spustitelná třída MainWindow . Jak již bylo uvedeno v analýze, GUI je T
T
rozděleno do tří hlavních částí, které jsou v následujících kapitolách podrobně rozepsány. Jednotlivé části GUI jsou od sebe odděleny pomocí záložek v hlavním okně aplikace.
4.5.
GUI Editoru tagů
Obr. 3 - GUI editoru tagů
32
Základním požadavkem byla hromadná editace tagů (velké množství softwaru umožňuje editovat tagy pouze po jednom). Tato aplikace umožňuje editovat tagy v celém adresáři najednou. Za tímto účelem byla použita tabulka (komponenta swing JTable), která je realizována ve třídě JPanelTableTags . T
Tabulka využívá třídy TableModelTags a T
T
TableModelListenerTags.
Vše by měl objasnit následující obrázek (Obr. 4) . Opět jsou vyobrazeny
T
T
T
pouze základní atributy a metody.
Obr. 4 - Diagram tříd - Tabulka pro editaci tagů
Třída JPanelTableTags tedy představuje panel s tabulkou (grafická část T
T
komponenty) a dalšími ovládacími tlačítky. Třída TableModelTags realizuje T
T
model dat tabulky. Uchovává data a stará se o čtení a zápis dat do tabulky. Třída TableModelListenerTags , sleduje změny dat tabulky T
T
a zajišťuje zápis informací přímo do souboru. Po otevření adresáře se načtou informace z tagů do tabulky. Pokud soubor neobsahuje ID3v2, načte se ID3v1. Pokud není ani ID3v1, zůstane řádek prázdný. Tagy lze editovat prostým kliknutím kamkoliv v tabulce a přepsáním stávajícího údaje (podobně jako např. v Excelu). Informace jsou ihned po opuštění editované buňky zapsány přímo do souboru. Soubory během práce nezůstávají otevřené. Soubor se vždy otevře a po ukončení čtení nebo zápisu opět neprodleně uzavře, tím tedy program nebrání ostatním aplikacím pracovat se soubory. Tabulka obsahuje pouze nejdůležitější informace, které se běžně do tagů ukládají (to znamená vše, co umožňuje ID3v1). První sloupeček v tabulce je název souboru, který lze editovat stejně jako ostatní údaje. Pod tabulkou jsou dále umístěny tlačítka pro vytvoření tagu a tlačítko Zpět.
33
Pro hromadnou editaci tagů slouží panel s ovládacími tlačítky -
třída
JPanelCopyTag . Pomocí tohoto panelu je možno například změnit název
T
T
interpreta ve všech souborech adresáře. To umožňuje pohodlné editování tagů celého alba, kde pomocí několika kliknutí opravíte téměř všechny informace kromě názvu skladby, který je samozřejmě pro každou píseň rozdílný. Dále je zde funkce pro vytvoření názvu písně z tagu a naopak. Funkčnost třídy spočívá pouze v manipulaci s modelem dat tabulky.
4.6.
GUI pro vytváření karaoke
Obr. 5 - GUI Karaoke Editoru
Jak je vidět z obrázku (Obr. 5) , rozvržení grafických komponent je přesně T
takové,
jak
bylo
T
popsáno
v analýze.
Celé
GUI
tvoří
třída
JPanelCreateKaraoke . Ke zobrazení textu písně nebyla použita standardní
T
T
komponenta JTextArea , ale JTextPane. Tato komponenta umožňuje měnit T
T
T
T
nastavení fontu pro různé úseky textu, což bylo nutné pro odlišení již přehraného textu.
34
V pravém dolním rohu je umístěn panel pro editaci výsledného karaoke. Ten využívá třídu SpringUtilities , pro rozmístění textových polí. Vpravo T
T
nahoře je umístěna nápověda, která se mění podle akcí, které uživatel provede. KaraokeEditor umožňuje exportovat výsledné karaoke (celý tag) do souboru s příponou *.kar. Pokud se tedy chce uživatel o vytvořené karaoke podělit s ostatními uživateli, stačí nahrát soubor *.kar, jehož velikost je oproti soboru mp3 pouze v řádu jednotek kilobajtů.
4.7.
GUI pro přehrávání karaoke
Obr. 6 - GUI přehrávače karaoke
Hlavní
třídou
obsahující
GUI
pro
přehrávání
karaoke
je
JPanelPlayKaraoke . Třída se pokusí otevřít soubor a zjistí, zda obsahuje
T
T
karaoke nebo text písně. Pokud ano, předá informace ostatním komponentám. V pravé části je umístěný text písně v JTextArea . V horní části je T
T
přehrávač mp3 (jde pouze o grafické rozhraní), který je realizován třídou
35
Player . Třída využívá knihovny JLayer 1.0 - www.javazoom.net . Jak je vidět
T
T
HTU
UTH
z obrázku rozhraní přehrávače, umožňuje pouze základní funkce (Play, Stop, Pause) se zobrazením délky skladby a uplynutého času + ovládání hlasitosti. Pro zobrazení „karaoke textu“ je použita třída JPanelKaraoke . T
T
Výsledného efektu (plynule se posouvající text odzdola nahoru - podobně jako závěrečné titulky filmů) je zde dosaženo pomocí metody paint na JPanel . T
Právě
přehrávaný
řádek
textu
je
barevně
odlišen
T
od
T
T
ostatních.
JPanelKaraoke zajišťuje v průběhu přehrávání výpočet aktuálních souřadnic
T
T
pro jednotlivé řádky a poté pomocí metody drawString(x,y,text) T
T
vykresluje text přímo na panel.
Obr. 7 - Diagram tříd - karaoke přehrávač
36
5. Testování Vzhledem k povaze aplikace (čtení a zápis souborů s pevně definovanou strukturou) je testování jedna z nejdůležitějších částí vývoje. Jazyk Java se snaží předcházet co největšímu počtu chyb již při kompilaci (silná typová kontrola), ale i za běhu podává informace o chybách (kontrola indexů pole). Program samozřejmě využívá hierarchii výjimek jazyka Java. Jak již bylo naznačeno v teoretické části - tagy ID3v2 nemají pevně danou strukturu ani pořadí jednotlivých rámců. Bohužel některý software pro editaci tagů neukládá data do tagu přesně podle specifikace. Knihovna byla navržena ve snaze přečíst i nekorektně uložené informace, ovšem ne za cenu havárie celé aplikace. Vše bylo otestováno na velkém množství souborů mp3. Jednotlivé chyby, které se při testování objevily, byly postupně odstraňovány. Vzhledem k výše uvedeným skutečnostem však nelze zaručit stoprocentní odstranění chyb. Testování grafického uživatelského rozhraní bylo o poznání snadnější. GUI bylo vyvíjeno jako poslední část aplikace. Pro ověření korektnosti byly provedeny veškeré nabízené akce, čímž se ověřila správná funkčnost. Karaoke přehrávač byl pro účel testování převeden do formy Java Apletu a umístěn na internet ( www.karaoketexty.cz - webové stránky nejsou součástí HTU
UTH
této práce). Uživatelé těchto stránek průběžně podávali informace o nedostatcích aplikace, které byly následně odstraňovány.
37
38
6. Závěr Výsledkem této práce je funkční aplikace, která plně využívá knihovnu pro práci s tagy ID3. Aplikace se skládá ze tří části. První část tvoří editace tagů. Součástí aplikace je také vytváření a přehrávání „karaoke textu“. Hlavní cíle práce tedy byly splněny. Byl k tomu použit programovací jazyk Java(J2SE SDK) spolu s knihovnou JLayer 1.0 ( www.javazoom.net .),
T
T
T
která umožňuje přehrávání souborů mp3.
T
HTU
UTH
Vývojové prostředí bylo zvoleno
NetBeans IDE 5.5 .
T
T
Knihovna umí zpracovávat kompletně tagy ID3v1 a ID3v1.1 a „podstatnou“ část ID3v2. Podstatnou částí se rozumí zpracování nejdůležitějších rámců (název interpreta, skladby, alba, rok, žánr, číslo stopy, komentář, text písně a „karaoke text“) a struktury celého tagu. Knihovna neumí manipulovat s rámci, které slouží např. pro uložení obrázku nebo videa. Dále neumí zpracovávat některé nepovinné funkce ID3v2 např. vytvářet kontrolní součty CRC a kompresi rámců. Další rozvoj této práce by mohl být zaměřen na výše zmíněné nedostatky knihovny ve zpracování ID3v2. Dále zlepšit nejen grafickou podobu aplikace, ale také přidat další funkce, jako např. podpora „karaoke textu“ pro více jazyků, nebo vytváření názvu souboru z tagu pomocí regulárních výrazů.
39
40
7. Seznam použité literatury [1]
Eckel, Bruce - Myslíme v jazyku Java - knihovna programátora, Praha: Grada, první vydání, 2001. 431 stran, ISBN 80-247-9010-6
[2]
Eckel, Bruce - Myslíme v jazyku Java - knihovna zkušeného programátora, Praha: Grada, první vydání, 2001. 470 stran, ISBN 80-247-0027-1
[3]
Herout, Pavel - Java - Grafické uživatelské prostředí a čeština, Praha: KOPP, 2006. 316 stran, ISBN 80-7232-237-0
[4]
ID3 tag standart pro MP3, popis a spcifikace, dostupné na www.id3.org
[5]
Specifikace a popis formátu MP3, dostupné na
HTU
http://home.zcu.cz/~mtoman/mp3.pdf
HTU
[6]
UTH
UTH
MPEG Audio Layer I/II/III struktura rámce, dostupné na http://mpgedit.org/mpgedit/mpeg_format/MP3Format.html
HTU
UTH
41
42
Příloha A.
Manuál k programu KaraokeEditor
Na následujících stránkách jsou popsány funkce a ovládání programu KaraokeEditor. Popisuje se zde verze 1.02. Pokud máte novější verzi, je možné že bude obsahovat některé funkce, které nejsou v manuálu popsané.
Co je KaraokeEditor? Program slouží pro editaci tagů v hudebních souborech formátu mp3. Tagy jsou doprovodné informace o písni, uložené přímo v mp3. Aplikace umí pracovat s tagy ID3v1 a ID3v2. Program dále umí uložit do mp3 tzv. karaoke text, což je text písně, který se plynule zobrazuje během přehrávání skladby. Další funkcí je přehrávání mp3 souborů a zobrazování karaoke textu.
Proč používat KaraokeEditor? KaraokeEditor umožňuje pohodlnou a snadnou editaci tagů a to buď po jednotlivých souborech, nebo hromadně. Dále umožňuje velmi snadno a rychle vytvořit „karaoke text“ a ten následně zobrazit spolu s přehráním skladby.
Instalace programu Program je napsán v jazyce Java. Proto jej lze spustit na jakémkoliv operačním systému, pokud máte nainstalovaný JVM (virtuální stroj Javy). JVM lze stáhnout na stránkách
HTU
www.java.com . Stačí tedy rozbalit archiv UTH
KaraokeEditor.zip a poklepat na soubor KaraokeEditor.jar.
Hlavní okno aplikace Po spuštění programu se Vám otevře okno, které je pomocí záložek (Tabů) rozděleno na 3 části, které budou zvlášť popsány na následujících stránkách. •
Editor tagů
•
Karaoke editor
•
Karaoke přehrávač
43
Editor tagů
Obr. 8 - Editor tagů
Otevření adresáře: Kliknutím v menu na Soubor -> Otevřít se Vám T
T
zobrazí klasický dialog, pro volbu adresáře. Zvolte tedy adresář, ve kterém se nachází mp3, u kterých chcete editovat tagy. Po odklepnutí se Vám zobrazí v tabulce (1) načtené informace tagů ze souborů v adresáři. Editace údajů: Záhlaví tabulky (2) popisuje, co se v daném sloupci nachází. První sloupec představuje název souboru, v dalších jsou základní informace o skladbách. Tagy lze editovat dojitým kliknutím kamkoliv v tabulce a následným přepsáním dané informace. Po stisknutí klávesy Enter, nebo po opuštění editované buňky jsou data zapsáno přímo do souboru. Editovat nelze pouze poslední dva sloupce, které informují o verzi tagu a karaoke. Stejně jako informace z tagu lze změnit i název souboru. Hromadná editace: Pokud máte otevřené např. jedno album a chcete změnit u všech písní název interpreta, bylo by určitě zbytečně zdlouhavé vyplňovat tento údaj u všech souborů. Pro tento účel slouží panel Editace více T
souborů najednou (4). Nejprve označte soubory, které chcete editovat. T
Označení lze provést pomocí klávesy Ctrl a kliknutí levého tlačítka myši pro T
T
44
výběr jednotlivých položek, nebo stiskem klávesy Shift a levého tlačítka myši T
T
pro výběr souvislé množiny řádků. Vlevo nad tabulkou se také nachází tlačítko Označit vše . Poté stačí zadat do příslušného textového pole novou
T
T
T
T
T
T
hodnotu a kliknout na tlačítko změň . Údaj se změní u všech Vámi vybraných T
T
řádků. Automatické opravy: editor obsahuje také několik funkcí pro automatické opravy (5). Pokud například máte správně pojmenovaný soubor, lze z jeho názvu přečíst údaje o interpretovi a názvu skladby (soubor musí být pojmenovaný ve formátu: NÁZEV INTERPRETA - název písně.mp3). Lze samozřejmě použít i opačný postup - podle údajů v tagu vytvořit název souboru. Slouží k tomu tlačítka Název
souboru
T
>>
Tag
T
a Tag T
>>
název
souboru. Dále je zde tlačítko Oprav Tag , které změní název interpreta na T
T
T
T
T
všechna velká písmena a u názvu písně nastaví první písmeno v každém slově na velké. Tlačítko oprav názvy souborů, změní název souboru opět na formát NÁZEV INTERPRETA - název písně.mp3. Tyto funkce Vám mohou ušetřit opravdu hodně práce. Udělali jste chybu? - Vzhledem k tomu, že jakékoliv úpravy se ihned zapíšou do souboru, musí zde být v případě chyby ze strany uživatele cesta zpět. Proto se ihned po otevření adresáře uloží aktuální nastavení tagů a názvů souborů do paměti. Pokud někde během editace uděláte chybu, stačí stisknout tlačítko Zpět a vše se vrátí do původního stavu. Nutno poznamenat, že po T
T
zavření aplikace nebo otevření jiného adresáře již nelze obnovit původní data.
45
Vytvoření karaoke
Obr. 9 - Vytváření karaoke
Během vytváření karaoke sledujte okno s označením Nápověda (3), ve T
kterém
se
budou
na
základě
Vašich
akcí
zobrazovat
T
informace
o
dalším postupu. Nejprve klikněte na Soubor -> Otevřít a vyberte soubor mp3, u T
kterého chcete vytvořit karaoke text. V pravém horním rohu je zobrazen název otevřeného souboru (5). Do textového pole s označením karaoke text (1) vložte text písně, který buď napíšete, nebo najdete na internetu. Pro vytváření karaoke slouží ovládací tlačítka (2). Stiskněte tedy tlačítko
T
Start Karaoke, spustí se píseň. Vždy když v písni uslyšíte začátek řádku textu, stiskněte tlačítko Další řádek. Řádek se obarví namodro. Až se v písni odzpívá celý obarvený řádek a uslyšíte začátek dalšího, opět stiskněte Další řádek. Takto projděte celý text písně. Jakmile dosáhnete konce, zaktivní se tlačítko Stop Karaoke, stiskněte jej.
46
V pravé dolní části (4) se Vám ukáže přehled řádků textu písně a k nim
T
čas od začátku skladby, kdy se má daný řádek zobrazit. Zde můžete ještě doopravit např. překlepy v textu nebo upravit jednotlivé časy. Nakonec nezapomeňte stisknout tlačítko Uložit, Vámi vytvořené karaoke
T
se uloží do souboru mp3. Karaoke text lze poté přehrát přímo v programu (záložka Karaoke
T
přehrávač), nebo např. ve Windows Media Playeru - po zapnutí titulků.
T
Přehrávání karaoke
Obr. 10 - Přehrávání karaoke
Klikněte na Soubor -> Otevřít a vyberte píseň, kterou chcete přehrát.
T
T
Otevřený soubor je zobrazený vlevo nahoře (3). Po otevření se ihned spustí přehrávání písně. V části Karaoke přehrávač (1) jsou tlačítka pro základní T
T
ovládání přehrávání (Play, Stop, Pause), odehraný čas, délka skladby a posuvník pro ovládání hlasitosti. Pod přehrávačem je zobrazený Karaoke text (4) . Právě přehrávaný T
T
řádek textu je zobrazen tmavší barvou. V pravé části je klasický text písně (2). Dále zde najdete panel s informacemi o přehrávané skladbě (5) 47
Obsah přiloženého CD •
/app - spustitelná aplikace (jar)
•
/src - zdrojové kódy
•
/prj - projektový adresář NetBeans IDE
•
/text - text práce ve formátu pdf
•
manual.pdf - manuál k programu karaokeEditor
•
abstract_CZ.txt
•
abstract_EN.txt
•
readme.txt - návod ke spuštění programu
48