Szerző Téma: Mp3 kezelés  (Megtekintve 498 alkalommal)

0 Felhasználó és 1 vendég van a témában

Nem elérhető rajmund

  • Törzstag
  • **
  • Hozzászólások: 460
Mp3 kezelés
« Válasz #1 Dátum: 2010. április 26., 22:41:47 »
Reaperrel találtunk egy ilyen mp3 kezelő scriptet neten

Hát sok értelme ugye nincs, de szerintem tök poén. A kommentekben van pár példa arra hogy hogy kell összerakni 2 zenét meg megvágni egyet. Jelenleg azt próbálom kisilabizálni, hogy lehet-e hangtónusokat, vagy frekvenciákat módosítani, szerintem a doFrameStuff valami ilyesmit csinál.
Kód: PHP
  1. <?php
  2. /*
  3. //Merge two files
  4. $path = 'path.mp3';
  5. $path1 = 'path1.mp3';
  6. $mp3 = new mp3($path);
  7.  
  8. $newpath = 'path.mp3';
  9. $mp3->striptags();
  10.  
  11. $mp3_1 = new mp3($path1);
  12. $mp3->mergeBehind($mp3_1);
  13. $mp3->striptags();
  14. $mp3->setIdv3_2('01','Track Title','Artist','Album','Year','Genre','Comments','Composer','OrigArtist',
  15. 'Copyright','url','encodedBy');
  16. $mp3->save($newpath);
  17.  
  18.  
  19. //Extract 30 seconds starting after 10 seconds.
  20. $path = 'path.mp3';
  21. $mp3 = new mp3($path);
  22. $mp3_1 = $mp3->extract(10,30);
  23. $mp3_1->save('newpath.mp3');
  24.  
  25. //Extract the exact length of time
  26. $path = 'path.mp3';
  27. $mp3 = new mp3($path);
  28. $mp3->setFileInfoExact();
  29. echo $mp3->time;
  30. //note that this is the exact length!
  31. */
  32. class mp3
  33. {
  34.     var $str;
  35.     var $time;
  36.     var $frames;
  37.      
  38.     function mp3($path="")
  39.     {
  40.         if($path!="")
  41.         {
  42.             $this->str = file_get_contents($path);
  43.         }
  44.     }
  45.      
  46.     function setStr($str)
  47.     {
  48.         $this->str = $str;
  49.     }
  50.      
  51.     function setFileInfoExact()
  52.     {
  53.         $maxStrLen = strlen($this->str);
  54.         $currentStrPos = strpos($this->str,chr(255));
  55.         $framesCount=0;
  56.         $time = 0;
  57.         while($currentStrPos < $maxStrLen)
  58.         {
  59.             $str = substr($this->str,$currentStrPos,4);
  60.             $strlen = strlen($str);
  61.             $parts = array();
  62.             for($i=0;$i < $strlen;$i++)
  63.             {
  64.                 $parts[] = $this->decbinFill(ord($str[$i]),8);
  65.             }
  66.             if($parts[0] != "11111111")
  67.             {
  68.                 if(($maxStrLen-128) > $currentStrPos)
  69.                 {
  70.                     return false;
  71.                 }
  72.                 else
  73.                 {
  74.                     $this->time = $time;
  75.                     $this->frames = $framesCount;
  76.                     return true;
  77.                 }
  78.             }
  79.             $a = $this->doFrameStuff($parts);
  80.             $currentStrPos += $a[0];
  81.             $time += $a[1];
  82.             $framesCount++;
  83.         }
  84.         $this->time = $time;
  85.         $this->frames = $framesCount;
  86.         return true;
  87.     }
  88.      
  89.     function extract($start,$length)
  90.     {
  91.         $maxStrLen = strlen($this->str);
  92.         $currentStrPos = strpos($this->str,chr(255));
  93.         $framesCount=0;
  94.         $time = 0;
  95.         $startCount = -1;
  96.         $endCount = -1;
  97.         while($currentStrPos < $maxStrLen)
  98.         {
  99.             if($startCount==-1&&$time>=$start)
  100.             {
  101.                 $startCount = $currentStrPos;
  102.             }
  103.             if($endCount==-1&&$time>=($start+$length))
  104.             {
  105.                 $endCount = $currentStrPos-$startCount;
  106.             }
  107.             $doFrame = true;
  108.             $str = substr($this->str,$currentStrPos,4);
  109.             $strlen = strlen($str);
  110.             $parts = array();
  111.             for($i=0;$i < $strlen;$i++)
  112.             {
  113.                 $parts[] = $this->decbinFill(ord($str[$i]),8);
  114.             }
  115.             if($parts[0] != "11111111")
  116.             {
  117.                 if(($maxStrLen-128) > $currentStrPos)
  118.                 {
  119.                     $doFrame = false;
  120.                 }
  121.                 else
  122.                 {
  123.                     $doFrame = false;
  124.                 }
  125.             }
  126.             if($doFrame)
  127.             {
  128.                 $a = $this->doFrameStuff($parts);
  129.                 $currentStrPos += $a[0];
  130.                 $time += $a[1];
  131.                 $framesCount++;
  132.             }
  133.         }
  134.         $mp3 = new mp3();
  135.         if($endCount == -1)
  136.         {
  137.             $endCount = $maxStrLen-$startCount;
  138.         }
  139.         if($startCount!=-1&&$endCount!=-1)
  140.         {
  141.             $mp3->setStr(substr($this->str,$startCount,$endCount));
  142.         }
  143.         return $mp3;
  144.     }
  145.      
  146.     function decbinFill($dec,$length=0)
  147.     {
  148.         $str = decbin($dec);
  149.         $nulls = $length-strlen($str);
  150.         if($nulls>0)
  151.         {
  152.             for($i=0;$i<$nulls;$i++)
  153.             {
  154.                 $str = '0'.$str;
  155.             }
  156.         }
  157.         return $str;
  158.     }
  159.      
  160.     function doFrameStuff($parts)
  161.     {
  162.         //Get Audio Version
  163.         $errors = array();
  164.         switch(substr($parts[1],3,2))
  165.         {
  166.             case '01':
  167.             $errors[]='Reserved audio version';
  168.             break;
  169.             case '00':
  170.             $audio = 2.5;
  171.             break;
  172.             case '10':
  173.             $audio = 2;
  174.             break;
  175.             case '11':
  176.             $audio = 1;
  177.             break;
  178.         }
  179.         //Get Layer
  180.         switch(substr($parts[1],5,2))
  181.         {
  182.             case '01':
  183.             $layer = 3;
  184.             break;
  185.             case '00':
  186.             $errors[]='Reserved layer';
  187.             break;
  188.             case '10':
  189.             $layer = 2;
  190.             break;
  191.             case '11':
  192.             $layer = 1;
  193.             break;
  194.         }
  195.         //Get Bitrate
  196.         $bitFlag = substr($parts[2],0,4);
  197.         $bitArray = array(
  198.     '0000'    => array(free,    free,    free,    free,    free),
  199.     '0001'    => array(32,    32,    32,    32,    8),
  200.     '0010'    => array(64,    48,    40,    48,    16),
  201.     '0011'    => array(96,    56,    48,    56,    24),
  202.     '0100'    => array(128,    64,    56,    64,    32),
  203.     '0101'    => array(160,    80,    64,    80,    40),
  204.     '0110'    => array(192,    96,    80,    96,    48),
  205.     '0111'    => array(224,    112,    96,    112,    56),
  206.     '1000'    => array(256,    128,    112,    128,    64),
  207.     '1001'    => array(288,    160,    128,    144,    80),
  208.     '1010'    => array(320,    192,    160,    160,    96),
  209.     '1011'    => array(352,    224,    192,    176,    112),
  210.     '1100'    => array(384,    256,    224,    192,    128),
  211.     '1101'    => array(416,    320,    256,    224,    144),
  212.     '1110'    => array(448,    384,    320,    256,    160),
  213.     '1111'    => array(bad,    bad,    bad,    bad,    bad)
  214.     );
  215.         $bitPart = $bitArray[$bitFlag];
  216.         $bitArrayNumber;
  217.         if($audio==1)
  218.         {
  219.             switch($layer)
  220.             {
  221.                 case 1:
  222.                 $bitArrayNumber=0;
  223.                 break;
  224.                 case 2:
  225.                 $bitArrayNumber=1;
  226.                 break;
  227.                 case 3:
  228.                 $bitArrayNumber=2;
  229.                 break;
  230.             }
  231.         }
  232.         else
  233.         {
  234.             switch($layer)
  235.             {
  236.                 case 1:
  237.                 $bitArrayNumber=3;
  238.                 break;
  239.                 case 2:
  240.                 $bitArrayNumber=4;
  241.                 break;
  242.                 case 3:
  243.                 $bitArrayNumber=4;
  244.                 break;
  245.             }
  246.         }
  247.         $bitRate = $bitPart[$bitArrayNumber];
  248.         //Get Frequency
  249.         $frequencies = array(
  250.         1=>array('00'=>44100,
  251.         '01'=>48000,
  252.         '10'=>32000,
  253.         '11'=>'reserved'),
  254.         2=>array(),
  255.         2.5=>array());
  256.         $freq = $frequencies[$audio][substr($parts[2],4,2)];
  257.         //IsPadded?
  258.         $padding = substr($parts[2],6,1);
  259.         if($layer==3||$layer==2)
  260.         {
  261.             //FrameLengthInBytes = 144 * BitRate / SampleRate + Padding
  262.             $frameLength = 144 * $bitRate * 1000 / $freq + $padding;
  263.         }
  264.         $frameLength = floor($frameLength);
  265.         $seconds += $frameLength*8/($bitRate*1000);
  266.         return array($frameLength,$seconds);
  267.         //Calculate next when next frame starts.
  268.         //Capture next frame.    
  269.     }
  270.      
  271.     function setIdv3_2($track,$title,$artist,$album,$year,$genre,$comments,$composer,$origArtist,
  272. $copyright,$url,$encodedBy)
  273.     {
  274.         $urlLength = (int)(strlen($url)+2);
  275.         $copyrightLength = (int)(strlen($copyright)+1);
  276.         $origArtistLength = (int)(strlen($origArtist)+1);
  277.         $composerLength = (int)(strlen($composer)+1);
  278.         $commentsLength = (int)strlen($comments)+5;
  279.         $titleLength = (int) strlen($title)+1;
  280.         $artistLength = (int)strlen($artist)+1;
  281.         $albumLength = (int) strlen($album)+1;
  282.         $genreLength = (int) strlen($genre)+1;
  283.         $encodedByLength = (int)(strlen($encodedBy)+1);
  284.         $trackLength = (int) strlen($track) + 1;
  285.         $yearLength = (int) strlen($year)+1;
  286.         $str .= chr(73);//I
  287.         $str .= chr(68);//D
  288.         $str .= chr(51);//3
  289.         $str .= chr(3);//
  290.         $str .= chr(0);//
  291.         $str .= chr(0);//
  292.         $str .= chr(0);//
  293.         $str .= chr(0);//
  294.         $str .= chr(8);//
  295.         $str .= chr(53);//5
  296.         $str .= chr(84);//T
  297.         $str .= chr(82);//R
  298.         $str .= chr(67);//C
  299.         $str .= chr(75);//K
  300.         $str .= chr(0);//
  301.         $str .= chr(0);//
  302.         $str .= chr(0);//
  303.         $str .= chr($trackLength);//
  304.         $str .= chr(0);//
  305.         $str .= chr(0);//
  306.         $str .= chr(0);//
  307.         $str .= $track;
  308.         $str .= chr(84);//T
  309.         $str .= chr(69);//E
  310.         $str .= chr(78);//N
  311.         $str .= chr(67);//C
  312.         $str .= chr(0);//
  313.         $str .= chr(0);//
  314.         $str .= chr(0);//
  315.         $str .= chr($encodedByLength);//
  316.         $str .= chr(64);//@
  317.         $str .= chr(0);//
  318.         $str .= chr(0);//
  319.         $str .= $encodedBy;
  320.         $str .= chr(87);//W
  321.         $str .= chr(88);//X
  322.         $str .= chr(88);//X
  323.         $str .= chr(88);//X
  324.         $str .= chr(0);//
  325.         $str .= chr(0);//
  326.         $str .= chr(0);//
  327.         $str .= chr($urlLength);//
  328.         $str .= chr(0);//
  329.         $str .= chr(0);//
  330.         $str .= chr(0);//
  331.         $str .= chr(0);//
  332.         $str .= $url;
  333.         $str .= chr(84);//T
  334.         $str .= chr(67);//C
  335.         $str .= chr(79);//O
  336.         $str .= chr(80);//P
  337.         $str .= chr(0);//
  338.         $str .= chr(0);//
  339.         $str .= chr(0);//
  340.         $str .= chr($copyrightLength);//
  341.         $str .= chr(0);//
  342.         $str .= chr(0);//
  343.         $str .= chr(0);//
  344.         $str .= $copyright;
  345.         $str .= chr(84);//T
  346.         $str .= chr(79);//O
  347.         $str .= chr(80);//P
  348.         $str .= chr(69);//E
  349.         $str .= chr(0);//
  350.         $str .= chr(0);//
  351.         $str .= chr(0);//
  352.         $str .= chr($origArtistLength);//
  353.         $str .= chr(0);//
  354.         $str .= chr(0);//
  355.         $str .= chr(0);//
  356.         $str .= $origArtist;
  357.         $str .= chr(84);//T
  358.         $str .= chr(67);//C
  359.         $str .= chr(79);//O
  360.         $str .= chr(77);//M
  361.         $str .= chr(0);//
  362.         $str .= chr(0);//
  363.         $str .= chr(0);//
  364.         $str .= chr($composerLength);//
  365.         $str .= chr(0);//
  366.         $str .= chr(0);//
  367.         $str .= chr(0);//
  368.         $str .= $composer;
  369.         $str .= chr(67);//C
  370.         $str .= chr(79);//O
  371.         $str .= chr(77);//M
  372.         $str .= chr(77);//M
  373.         $str .= chr(0);//
  374.         $str .= chr(0);//
  375.         $str .= chr(0);//
  376.         $str .= chr($commentsLength);//
  377.         $str .= chr(0);//
  378.         $str .= chr(0);//
  379.         $str .= chr(0);//
  380.         $str .= chr(0);//
  381.         $str .= chr(9);//
  382.         $str .= chr(0);//
  383.         $str .= chr(0);//
  384.         $str .= $comments;
  385.         $str .= chr(84);//T
  386.  
  387.         $str .= chr(67);//C
  388.         $str .= chr(79);//O
  389.         $str .= chr(78);//N
  390.         $str .= chr(0);//
  391.         $str .= chr(0);//
  392.         $str .= chr(0);//
  393.         $str .= chr($genreLength);//
  394.         $str .= chr(0);//
  395.         $str .= chr(0);//
  396.         $str .= chr(0);//
  397.         $str .= $genre;
  398.         $str .= chr(84);//T
  399.         $str .= chr(89);//Y
  400.         $str .= chr(69);//E
  401.         $str .= chr(82);//R
  402.         $str .= chr(0);//
  403.         $str .= chr(0);//
  404.         $str .= chr(0);//
  405.         $str .= chr($yearLength);//
  406.         $str .= chr(0);//
  407.         $str .= chr(0);//
  408.         $str .= chr(0);//
  409.         $str .= $year;
  410.         $str .= chr(84);//T
  411.         $str .= chr(65);//A
  412.         $str .= chr(76);//L
  413.         $str .= chr(66);//B
  414.         $str .= chr(0);//
  415.         $str .= chr(0);//
  416.         $str .= chr(0);//
  417.         $str .= chr($albumLength);//
  418.         $str .= chr(0);//
  419.         $str .= chr(0);//
  420.         $str .= chr(0);//
  421.         $str .= $album;
  422.         $str .= chr(84);//T
  423.         $str .= chr(80);//P
  424.         $str .= chr(69);//E
  425.         $str .= chr(49);//1
  426.         $str .= chr(0);//
  427.         $str .= chr(0);//
  428.         $str .= chr(0);//
  429.         $str .= chr($artistLength);//
  430.         $str .= chr(0);//
  431.         $str .= chr(0);//
  432.         $str .= chr(0);//
  433.         $str .= $artist;
  434.         $str .= chr(84);//T
  435.         $str .= chr(73);//I
  436.         $str .= chr(84);//T
  437.         $str .= chr(50);//2
  438.         $str .= chr(0);//
  439.         $str .= chr(0);//
  440.         $str .= chr(0);//
  441.         $str .= chr($titleLength);//
  442.         $str .= chr(0);//
  443.         $str .= chr(0);//
  444.         $str .= chr(0);//
  445.         $str .= $title;
  446.         $this->str = $str.$this->str;
  447.     }
  448.      
  449.     function mergeBehind(mp3 $mp3)
  450.     {
  451.         $this->str .= $mp3->str;
  452.     }
  453.      
  454.     function mergeInfront(mp3 $mp3)
  455.     {
  456.         $this->str = $mp3->str.$this->str;
  457.     }
  458.      
  459.     function getIdvEnd()
  460.     {
  461.         $strlen = strlen($this->str);
  462.         $str = substr($this->str,($strlen-128));
  463.         $str1 = substr($str,0,3);
  464.         if(strtolower($str1) == strtolower('TAG'))
  465.         {
  466.             return $str;
  467.         }
  468.         else
  469.         {
  470.             return false;
  471.         }
  472.     }
  473.      
  474.     function getStart()
  475.     {
  476.         $strlen = strlen($this->str);
  477.         for($i=0;$i<$strlen;$i++)
  478.         {
  479.             $v = substr($this->str,$i,1);
  480.             $value = ord($v);
  481.             if($value == 255)
  482.             {
  483.                 return $i;
  484.             }
  485.         }
  486.     }
  487.      
  488.     function striptags()
  489.     {
  490.         //Remove start stuff...
  491.         $newStr = '';
  492.         $s = $start = $this->getStart();
  493.         if($s===false)
  494.         {
  495.             return false;
  496.         }
  497.         else
  498.         {
  499.             $this->str = substr($this->str,$start);
  500.         }
  501.         //Remove end tag stuff
  502.         $end = $this->getIdvEnd();
  503.         if($end!==false)
  504.         {
  505.             $this->str = substr($this->str,0,(strlen($this->str)-129));
  506.         }
  507.     }
  508.      
  509.     function save($path)
  510.     {
  511.         $fp = fopen($path,'w');
  512.         fwrite($fp,$this->str);
  513.         fclose($fp);
  514.     }
  515.  
  516.  
  517. //join various MP3s
  518.     function multiJoin($newpath,$array)
  519.     {
  520.         foreach ($array as $path)
  521.         {
  522.             $mp3 = new mp3($path);
  523.             $mp3->striptags();
  524.             $mp3_1 = new mp3($newpath);
  525.             $mp3->mergeBehind($mp3_1);
  526.             $mp3->save($newpath);
  527.         }
  528.     }
  529. }
  530. ?>
  531.