Portál AbcLinuxu, 1. května 2025 17:30
Užitečné skripty 2: pouštíme večerníček
1.3.2007 22:12
| Přečteno: 1748×
| Linux
|
Dnes bude téme zase multimediální. Někdy se stane, že se máte
soubor (nebo i víc), ve kterém je víc dílů jednoho seriálu. Pokud si
chcete pouštět jen jednotlivé díly a ne celý soubor naráz, je docela
otrava hledat začátek konkrétního dílu. Dnešní skript dává možné řešení.
Abstrakt
Představme si, že máme seriál s pohádkami uložený v několika
souborech, v každém souboru je víc dílů.
Když chceme dětem pustit pohádku musíme vědět, který soubor vlastně
otevřít a potom
najít začátek konkrétního dílu. Dále je vhodné, aby se přehrávač po
skončení dílu sám vypnul (aby si děti
nemyslely, že jsme to my, kdo jim nedopřeje další pohádku).
Dnešní skript umí vypsat seznam dílů a uživatel jenom zadá číslo dílu,
který si vybral.
Samotný skript
Soubor
hrej.sh
- #!/bin/bash
- file1="serial_1.avi"
- file2="serial_2.avi"
- framerate=25
- names=( )
- time=( )
- filename=( )
- addName(){
- #parametry : 1) jmeno dilu, 2) jmeno souboru, 3) cas, kde dil zacina
- names[${#names[*]}]="$1"
- filename[${#filename[*]}]="$2"
- time[${#time[*]}]="$3"
- }
- time2seconds(){
- #parametr: hodiny:minuty:sekundy, napr. 1:23:50
- hours=`echo $1 | sed -e "s/\(.*\):\(.*\):\(.*\)/\1/"`
- mins=`echo $1 | sed -e "s/\(.*\):\(.*\):\(.*\)/\2/"`
- secs=`echo $1 | sed -e "s/\(.*\):\(.*\):\(.*\)/\3/"`
- result=`expr 3600 \* $hours + 60 \* $mins + $secs`
- echo $result
- }
- dotaz(){
- echo "============== $1 ===================="
- length=`expr ${#names[*]} - 1`
- for i in `seq 0 $length`
- do
- echo "$i) ${names[$i]}"
- done
- echo -n "Zadej, který díl chceš přehrát: "
- read dil
- if [ 0 -le $dil -a $dil -le $length ]
- then
- ok=1
- next=`expr $dil + 1`
- if [ \( $dil -eq $length \) -o \( x${filename[$dil]} != x${filename[$next]} \) ]
- then
- options="-ni -ss ${time[$dil]}"
- else
- start=`time2seconds ${time[$dil]}`
- end=`time2seconds ${time[$next]}`
- dif=`expr $end - $start`
- frames=`expr $framerate \* $dif`
- options="-ni -ss ${time[$dil]} -frames $frames"
- fi
- mplayer -fs $options "${filename[$dil]}"
- else
- ok=0
- fi
- }
- addName "Skal a stepí divočinou" "$file1" "0:0:0"
- addName "Šla Nanynka do zelí" "$file1" "0:6:59"
- addName "S puškou v ruce s ohněm v srdci" "$file1" "0:14:11"
- addName "Natrhala lupení" "$file1" "0:21:38"
- addName "V Ukrajině a Povolží" "$file2" "0:0:0"
- addName "Přišel na ni Pepíček" "$file2" "0:14:26"
- addName "A s pomocí eskadrony" "$file2" "0:19:49"
- addName "Rozšlapal jí košíček" "$file2" "0:25:15"
- ok=0
- while [ $ok -ne 1 ]
- do
- dotaz "Seriál"
- done
Lehké vysvětlení:
- řádky 3--5: nastavení. Nastaví se jména souborů se seriálem a framerate video souborů (viz dále)
- řádky 7--9: inicializace polí, která budeme potřebovat
- řádky 11--15: pomocná funkce, která plní pole inicializovaná výše
- řádky 18--24: pomocná funkce, která převádí čas z formátu HH:MM:SS na sekundy
- řádky 28--56: hlavní funkce, rozebereme ji podrobněji
- řádky 30--34: vypíše očíslovaný seznam všech dílů (data se krmí později, viz níže)
- řádek 38: jednoduchá kontrola, jestli uživatel zadal správný vstup
- řádek 42: rozhoduje se, jestli má cenu nastavovat parametry pro vypnutí přehrávače. Pokud je díl poslední v souboru, stačí nastavit začátek (řádek 44)
- řádky 46--50: nastavení parametrů pro vypnutí mplayeru po skončení dílu. Kupodivu volba -endpos, která je doporučovaná na mnoha fórech platí jenom pro mencoder. Nenapadlo mě nic lepšího, než použít volbu -frames, proto se na začátku musí zadat framerate (většinou to je 25), zjistí se snadno z výstupu mplayeru. Drobná poznámka: pokud použijete převíjení (šipky), přeskočené rámce se nepočítají, takže se mplayer nakonec vypne jindy, než bylo zamýšleno.
- řádek 52: volá se mplayer s příslušnými parametry.
- řádky 59--67: krmí se data. Je to pracné, ale dobrá zpráva je, že to stačí udělat jen jednou. Zadá se název dílu, název souboru, čas začátku dílu.
Aby skript fungoval správně, musí se zadávat vždy díly z jednoho souboru pohromadě a v rámci jednoho souboru tak, jak jdou za sebou. Z praktických důvodů by bylo lepší mít název souboru až jako třetí parametr, aby šel vynechat, pokud je soubor jenom jeden (je nutné změnit řádek 52). Takhle jsem o tom začal přemýšlet, až když jsem měl soubor nakrmený daty.
- řádky 69--70: smyčka, která pouští hlavní funkci pořád dokola, než se uživateli podaří zadat číslo ve správném intervalu.
Teď stačí skript umístit do adresáře s videosoubory. Dále je vhodné
nastavit mu práva na spuštení (chmod +x), aby se skript dal jednoduše
spustit v terminálu. Pokud to z nějakých důvodů nelze zařídit, musí
uživatel psát něco ve smyslu bash hrej.sh.
Místa k vylepšení, otázky
- Nejde vypínání udělat jednodušeji?
- Pouštím seriál ze síťového disku na 2 různých počítačích,
které mají různá locales (il2 a utf¯8). Jak zařídit, aby byly
výpisy na obou správně?
- Často se mi stává, že u seriálů ripnutých z DVD se lehce předbíhá zvuk před obrazem tempem zhruba 10s za hodinu (na začátku je zvuk v pořádku). Neví někdo, jak ukecat mplayer, aby trochu zpomalil zvuk?
Tiskni
Sdílej:
Komentáře
Vložit další komentář
1.3.2007 22:29
laurel
Re: Užitečné skripty 2: pouštíme večerníček
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.