Hlavní navigace

Cdbase - váš organizátor MP3

Jan Molič

Představte si situaci: Máte 100 cédéček plných MP3. Hledáte určitou skladbu, přičemž vůbec neznáte její název (sql databáze vám tedy moc nepomůže) nebo jen přemýšlíte, co si pustit, a názvy vám nic neříkají. V dnešním článku si představíme scriptík, který vám orientaci v záplavě MP3 elegantně usnadní.

Napsal jsem skript, který vytvoří „obraz“ CD na disku – zkopíruje adresáře a do nich:

  • zapíše krátkou ukázku z původního zvukového souboru
  • zkopíruje .m3u playlisty
  • zapíše prázdné soubory (v ostatních případech)

Obraz CD jednoduše „prolezete“ ENTERem, vyhledat soubor podle názvu také není složité, a navíc – ukázky.

Výrobní postup

Každá ukázka bude začínat v první minutě původního souboru a bude trvat 20s. Použijeme (samozřejmě) formát .ogg v nejhůře možné poslouchatelné kvalitě.

výroba ukázky OGG z MP3

Na mp3 nelze použít sox, mp32ogg jsem nenašel, proto jsem vytvořil rouru přímo z mpg123:

mpg123 --skip 2400 --frames 400 --4to1 --singlemix
 --8bit --stdout "zdroj.mp3" | oggenc --raw --raw-bits=8
 --raw-rate=11000 --raw-chan=1 --quality -1 -o "ukazka.ogg" -

Parametry mpg123 říkají, že má začít přehrávat na framu 2400 (cca po 1 minutě) a přehrát 400 framů (cca 20s). Bude tak činit mono, 8bitově a nekvalitně (11 000Hz). Výsledek pošle na standardní výstup.
Na standardním vstupu oggenc tedy nalezne data ve formátu raw, proto mu musíme upřesnit jejich parametry. (Rourou není vhodné posílat wavy, neboť součástí jejich hlaviček má být výsledná velikost, kterou nelze ze streamu zjistit, nicméně jsem zjistil, že to jde :-))

výroba ukázky OGG z OGG

Sox, který by měl umět z oggu vytvořit přímo nový ogg, mi, bohužel, vytvořil „Segmentation fault“.
Chtěl jsem tedy okopírovat postup jako u mp3, jenže ogg123 umí jen skip framů, ne však přehrání jejich určitého počtu. Proto jsem použil sox alespoň jako přehrávač.

Vyrobil jsem rouru:

sox -t ogg /dev/stdin -t raw -r 11000 -c 1 -b -u
 /dev/stdout trim 60 20 < "zdroj.ogg" | oggenc --quiet
 --raw --raw-bits=8 --raw-rate=11000
 --raw-chan=1 --quality -1 -o "ukazka.ogg" -

Ptáte-li se, proč bere sox zdrojová data ze standardního vstupu – neumí totiž mezery v názvech souborů, ať už backslashovaných, nebo i ouvozovkovaných.
Výsledkem je opět raw a zbytek je totožný.

výroba ukázky OGG z WAV

Jako u bodu 2, pouze rozdílný vstupní formát pro sox.

ostatní nekomprimovaná RAW audia

Z nich ukázky nedělá (ačkoliv by šel použít postup jako v bodě 3), neboť je nutné znát u každého zvuku sample rate, počet kanálů,…

Použití

Vzhledem k tomu, že pracuji s php, skript je napsán v php. Jasně, není to Perl, není to Bash, není to… Není to jedno? (Především není těžké ho přeložit třeba do Perlu s využitím knihoven bez nutnosti rour, rád se poučím.)

Po spuštění budete dotázáni, odkud se má načítat – defaultně z /mnt/cdrom. Další dotaz se bude týkat místa ukládání – defaultně do aktuálního adresáře. Osobně skript používám tak, že ho mám v adresáři „cdbase“ a jako druhý dotaz vkládám názvy CD (např. „HUDBA 26“), které se tím uloží do podadresářů.

ls -a cdbase

    HUDBA 26
    HUDBA 12
    cdbase*

Výsledek: všech 100 CD se „vejde“ na jediné, což je, myslím, velmi praktické.

Našli jste v článku chybu?