MIDI – MP3 konvertálás PHP-val

Mistoj Sándortól kaptunk egy PHP szkriptet, amivel egyszerre több MIDI fájlt lehet MP3 formátumra konvertálni…

Annak ellenére, hogy a program PHP-alapú igazából az oldal témájába nem igazán fér bele, mivel nem túl sok köze van a webfejlesztéshez, kitesszük, mert egy hasznos program, és sokmindent jól lehet vele példázni…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#!/usr/bin/php 
<?php
 
######################################
# UHU LINUX 1.2
#
######################################
# *.MID ->> *.WAV ->>> *.MP3 formátumra alakítás
#
# Másold a konvertállandó *.mid fajlokat egy mappába és másold bele a scriptet
# A script jogosultságára és a sajátodéra figyelj.
# kimeneti fájlnevek megegyeznek a mid fajl nevével + kiterjesztés (wav; mp3)
#
######################################
# A convertáláshoz szükséges a timidity csomag /van neki grafikus felülete is/
# :: timidity apt-get install timidity
# http://timidity.sourceforge.net/
# LAME csomag: apt-get install lame
# http://lame.sourceforge.net/
# PHP legyen felteltpítve, valamint a system vagy exec függvény is legyen elérhetõ
# Amit élles környezetben nem javaslok.
#
######################################
# ha nincs PHP akkor kozolba írd be ezeket:
# fájl nevek: $kimenet.wav - kimenet neve; $bemenet.mid a bemenet neve
# timidity -Ow -o $kimenet.wav $bemenet.mid
# lame -q 9 -V 9  $kimenet.wav $bemenet.mp3
#
###############################################
#tovabbi infók: man timidity; man lame
#egy vagon beállításuk van ezek egy aránylag türhetõ eredményt produkálnak
#
######################################
#system vagy exec függvény teszt

if (function_exists('system'))
{
    $sfugveny=TRUE;
 
}elseif (function_exsits('exec'))
{
 
    $sfugveny=FALSE;
 
}else
{
 
print "\nA mûvelet nem hajtható végre, hiányoznak a rendszer függvények system vagy exec!" ;
exit;
 
}
 
//--------------------------------------------------------
#mid fajlok beolvasása a tárgy mappából

if ($a =opendir("./"))
{
    while (($fajl=readdir($a))!== false)
        {
            if ( is_file ($fajl) && strstr($fajl,".mid"))
            {    
 
                print  "A Regisztrál *.mid fájlok: $fajl\n" ;
                 $midfajlok[]=$fajl ; // mid fajlok listaja a midfajlok valtozoban
 
             }
        }
}
 
//--------------------------------------------------------
#A lényegirészek, ha vannak *.mid fajlok a mappában

if (isset($midfajlok)){
 
 
      print "\nA türelem rózsát terem ..... zzZZzzz...\n\n" ;
 
    for ($i=0; $i<sizeof($midfajlok); $i++)
    {
        #nevek kialakitasa $i* = input; $o*=output
        
        $imidfajl=    $midfajlok[$i];
        $owavfajl=    ereg_replace(".mid",".wav", $imidfajl);
        $omp3fajl=    ereg_replace(".mid",".mp3", $imidfajl);
 
    #mid 2 wav
             print ":: kovertálás " . $imidfajl. " ->> ". $owavfajl. "\n"; 
 
        if ( $sfugveny)
        {
 
            print  system ("timidity -Ow -o $owavfajl $imidfajl" );
 
        }else
        {
 
            print  exec ("timidity -Ow -o $owavfajl $imidfajl" );
 
        }
 
    #wav 2 mp3
             print ":: kovertálás " . $iwavfajl . " ->> ". $omp3fajl ."\n"; 
 
        if ( $sfugveny)
        {
 
            print  system ("lame -q 9 -V 9 $owavfajl $omp3fajl" );
 
        }else
        {
 
            print  exec ("lame -q 9 -V 9 $owavfajl $omp3fajl" );
 
        }
 
            print  "($i.) Munkamenet - $imidifajl - kovertálás kész!\n" ;
 
    }
 
      print "\nVégeztünk!\n";
 
//--------------------------------------------------------
#ende nincsnek *.mid fajlok a mappában

}else
{
 
    print "\nhelyezed el a tárgy mappába a *.mid fajlokat és indítsd újra a scriptet!\n" ;
    exit;
 
}
 
?>

Mint ahogy az a kommentekből olvasható a szkript elsősorban Linux rendszerek alá készült, azonban a szükséges programoknak van Windows-os verziója is, így ezen az op.rendszeren is futtathatóak. Mivel a kommentezett sorokban elég részletesen le van írva a program használata, így most ezt nem részletezném, inkább bemutatnék néhány érdekességet a szkriptel kapcsolataban.
Már az első sorban (#!/usr/bin/php) találunk valamit, amit nem túl gyakran látunk PHP kódokban. Ne tévesszen meg senkit, ez nem egy “ittfelejtett” komment (nem is a CGI futtatható állományként telepített PHP esetében fontos. Érdemes a php.net kapcsolódó oldalán elolvasni a 4. eset : PHP feldolgozó a web könyvtárfán kívül című leírást.

A következő dolog, amin megakad az ember szeme az ez a sor:

1
#system vagy exec függvény teszt

Mi az a System() és a Exec() függvény?

Ezen függvények segítségével külső programokat futtathatunk le. Mivel ez egy hatalmas veszély-forrás a legtöbb (ingyenes) webszolgáltató (de majdnem mindenki, akinek a webszervere látható a “net felől”) kapásból letiltja.
Ezt a függvényt rengeteg dologra használhatjuk: például ha van egy játékszerverünk, akkor pillanatok alatt lehet írni egy olyan szkriptet, ami egy HTTP Base felhasználó-ellenőrzés után megnézi, hogy fut-e a szerver, ha igen leállítja, ha nem, akkor elindítja.

Természetesen ez csak egy példa volt, még másik millió felhasználási területe lehet ezen függvénynek…

A szkripteket általában változtatás nélkül közöljük le, jelen esetben is így volt, de azért két dologra szeretném felhívni a figyelmet:

1
if (isset($midfajlok)){

Ez az ellenőrzés ebben a szkriptben bőven elég, mivel – amennyiben módosítás nélkül futtatjuk – nem valószínű, hogy a $midifajlok változó be lesz állítva ha nincsenek midi fileok a könyvtárban, de élesben futó programnál érdemes ellenőrizni, hogy valóban tömb az értéke (például egy függvény visszatérési értéke egy tömb vagy false is lehet), különben egy rakás hibaüzenetet kapunk a következő ciklusban, ahol végig tömbként kezeljük az adott változót.

(Vagy másik megoldás, hogy az array() függvénnyel létrehozunk egy üres tömböt, és nem for() hanem foreach() ciklusban nézzük végig az elemeit…)

1
2
$owavfajl= ereg_replace(".mid",".wav", $imidfajl); 
$omp3fajl= ereg_replace(".mid",".mp3", $imidfajl);

Ez a két sor két problémát is felvet: az egyik, hogy az ereg_* függvények viszonylag lassúak, ami sok filenál (több ezer) már látványos lassulást eredményez. Amennyiben nem használunk reguláris kifejezést előnyősebb az str_replace() függvény használata.

Ezen kívül a “.mid” kiterjesztés lehetne “.MiD” is és a fenti kód ebben az esetben lazán felülírná az eredeti midi fájlunkat az új mp3-al fájllal. Erre megoldás PHP 5 környezeben az str_ireplace() függvény, PHP 4 alatt meg vagy az eregi_replace(), vagy a preg_replace() függvény.

(Azért ez utóbbihoz hozzátartozik, hogy a jelen szkriptben az strstr() függvény alkalmazása miatt ez a probléma nem fordulhat elő)

Természetesen a fentebbi bekezdésben taglaltak ellenére is remek szkriptet kaptunk, de ha már ismertető leírásnak készül ez a cikk, gondoltam leírom az ilyen egyszerű, mégis sok fejtörést okozható buktatókat.

HOZZÁSZÓLOK A CIKKHEZ

Kérjük, írja be véleményét!
írja be ide nevét