首页后端开发PHPphp获取mp3音频信息实例教程

php获取mp3音频信息实例教程

时间2024-02-02 06:00:03发布访客分类PHP浏览992
导读:收集整理的这篇文章主要介绍了php获取mp3音频信息实例教程,觉得挺不错的,现在分享给大家,也给大家做个参考。php获取mP3音频信息很早之前在网上看到一个获取 MP3 音频信息的 php 类。如:播放时长、文件大小、文件编码等等<?...
收集整理的这篇文章主要介绍了php获取mp3音频信息实例教程,觉得挺不错的,现在分享给大家,也给大家做个参考。

php获取mP3音频信息

很早之前在网上看到一个获取 MP3 音频信息的 php 类。如:播放时长、文件大小、文件编码等等

?phpclass mp3file{
        PRotected $block;
        protected $blockpos;
        protected $blockmax;
        protected $blocksize;
        protected $fd;
        protected $bITpos;
        protected $mp3data;
    public function __construct($filename)    {
            $this->
    powarr  = array(0=>
    1,1=>
    2,2=>
    4,3=>
    8,4=>
    16,5=>
    32,6=>
    64,7=>
    128);
            $this->
    blockmax= 1024;
                    $this->
    mp3data = array();
            $this->
    mp3data['Filesize'] = filesize($filename);
            $this->
    fd = foPEn($filename,'rb');
            $this->
    prefetchblock();
            $this->
    readmp3frame();
    }
    public function __destruct()    {
            fclose($this->
    fd);
    }
    //-------------------    public function get_metadata()    {
            return $this->
    mp3data;
    }
    protected function readmp3frame()    {
            $iscbrmp3=true;
            if ($this->
    startswithid3())            $this->
    skipid3tag();
            else if ($this->
containsvbrxing())        {
                $this->
    mp3data['Encoding'] = 'VBR';
                $iscbrmp3=false;
        }
            else if ($this->
startswithpk())        {
                $this->
    mp3data['Encoding'] = 'Unknown';
                $iscbrmp3=false;
        }
            if ($iscbrmp3)        {
                $i = 0;
                $max=5000;
                //look in 5000 bytes...             //the largest framesize is 4609bytes(256kbps@8000Hz  mp3)            for($i=0;
     $i$max;
 $i++)            {
                    //looking for 1111 1111 111 (frame synchronization bits)                                if ($this->
    getnextbyte()==0xFF)                    if ($this->
    getnextbit() &
    &
     $this->
    getnextbit() &
    &
     $this->
    getnextbit())                        break;
            }
                if ($i==$max)                $iscbrmp3=false;
        }
            if ($iscbrmp3)        {
                $this->
    mp3data['Encoding'         ] = 'CBR';
                $this->
    mp3data['MPEG version'     ] = $this->
    getnextbits(2);
                $this->
    mp3data['Layer Description'] = $this->
    getnextbits(2);
                $this->
    mp3data['Protection Bit'   ] = $this->
    getnextbits(1);
                $this->
    mp3data['Bitrate Index'    ] = $this->
    getnextbits(4);
                $this->
    mp3data['Sampling Freq Idx'] = $this->
    getnextbits(2);
                $this->
    mp3data['Padding Bit'      ] = $this->
    getnextbits(1);
                $this->
    mp3data['Private Bit'      ] = $this->
    getnextbits(1);
                $this->
    mp3data['Channel Mode'     ] = $this->
    getnextbits(2);
                $this->
    mp3data['Mode Extension'   ] = $this->
    getnextbits(2);
                $this->
    mp3data['Copyright'        ] = $this->
    getnextbits(1);
                $this->
    mp3data['Original Media'   ] = $this->
    getnextbits(1);
                $this->
    mp3data['Emphasis'         ] = $this->
    getnextbits(1);
                $this->
    mp3data['Bitrate'          ] = mp3file::bitratelookup($this->
    mp3data);
                $this->
    mp3data['Sampling Rate'    ] = mp3file::samplelookup($this->
    mp3data);
                $this->
    mp3data['Frame Size'       ] = mp3file::getframesize($this->
    mp3data);
                $this->
    mp3data['Length'           ] = mp3file::getduration($this->
    mp3data,$this->
    tell2());
                $this->
    mp3data['Length mm:ss'     ] = mp3file::seconds_to_mmss($this->
    mp3data['Length']);
                            if ($this->
    mp3data['Bitrate'      ]=='bad'     ||                $this->
    mp3data['Bitrate'      ]=='free'    ||                $this->
    mp3data['Sampling Rate']=='unknown' ||                $this->
    mp3data['Frame Size'   ]=='unknown' ||                $this->
    mp3data['Length'     ]=='unknown')            $this->
    mp3data = array('Filesize'=>
    $this->
    mp3data['Filesize'], 'Encoding'=>
    'Unknown');
        }
        else        {
                if(!isset($this->
    mp3data['Encoding']))                $this->
    mp3data['Encoding'] = 'Unknown';
        }
    }
    protected function tell()    {
            return ftell($this->
    fd);
    }
    protected function tell2()    {
            return ftell($this->
    fd)-$this->
    blockmax +$this->
    blockpos-1;
    }
    protected function startswithid3()    {
            return ($this->
    block[1]==73 &
    &
     //I                $this->
    block[2]==68 &
    &
     //D                $this->
    block[3]==51);
  //3    }
    protected function startswithpk()    {
            return ($this->
    block[1]==80 &
    &
     //P                $this->
    block[2]==75);
  //K    }
    protected function containsvbrxing()    {
            //echo "!--".$this->
    block[37]." ".$this->
    block[38]."-->
    ";
            //echo "!--".$this->
    block[39]." ".$this->
    block[40]."-->
    ";
            return(               ($this->
    block[37]==88  &
    &
     //X 0x58                $this->
    block[38]==105 &
    &
     //i 0x69                $this->
    block[39]==110 &
    &
     //n 0x6E                $this->
    block[40]==103)   //g 0x67/*               ||                ($this->
    block[21]==88  &
    &
     //X 0x58                $this->
    block[22]==105 &
    &
     //i 0x69                $this->
    block[23]==110 &
    &
     //n 0x6E                $this->
    block[24]==103)   //g 0x67*/              );
       }
     protected function debugbytes()    {
            for($j=0;
     $j10;
 $j++)        {
                for($i=0;
     $i8;
 $i++)            {
                    if ($i==4) echo " ";
                    echo $this->
    getnextbit();
            }
                echo "BR>
    ";
        }
    }
    protected function prefetchblock()    {
            $block = fread($this->
    fd, $this->
    blockmax);
            $this->
    blocksize = strlen($block);
            $this->
    block = unpack("C*", $block);
            $this->
    blockpos=0;
    }
    protected function skipid3tag()    {
            $bits=$this->
    getnextbits(24);
    //ID3        $bits.=$this->
    getnextbits(24);
    //v.v flags        //3 bytes 1 version byte 2 byte flags        $arr = array();
            $arr['ID3v2 Major version'] = bindec(substr($bits,24,8));
            $arr['ID3v2 Minor version'] = bindec(substr($bits,32,8));
            $arr['ID3v2 flags'        ] = bindec(substr($bits,40,8));
            if (substr($bits,40,1)) $arr['Unsynchronisation']=true;
            if (substr($bits,41,1)) $arr['Extended header']=true;
            if (substr($bits,42,1)) $arr['Experimental indicator']=true;
            if (substr($bits,43,1)) $arr['Footer present']=true;
            $size = "";
            for($i=0;
     $i4;
 $i++)        {
                $this->
    getnextbit();
    //skip this bit, should be 0            $size.= $this->
    getnextbits(7);
        }
            $arr['ID3v2 Tags Size']=bindec($size);
    //now the size is in bytes;
            if ($arr['ID3v2 Tags Size'] - $this->
    blockmax>
0)        {
                fseek($this->
    fd, $arr['ID3v2 Tags Size']+10 );
                $this->
    prefetchblock();
                if (isset($arr['Footer present']) &
    &
 $arr['Footer present'])            {
                    for($i=0;
     $i10;
     $i++)                    $this->
    getnextbyte();
//10 footer bytes            }
        }
        else        {
                for($i=0;
     $i$arr['ID3v2 Tags Size'];
     $i++)                $this->
    getnextbyte();
        }
    }
    protected function getnextbit()    {
            if ($this->
    bitpos==8)            return false;
            $b=0;
            $whichbit = 7-$this->
    bitpos;
            $mult = $this->
    powarr[$whichbit];
     //$mult = pow(2,7-$this->
    pos);
            $b = $this->
    block[$this->
    blockpos+1] &
     $mult;
            $b = $b >
    >
     $whichbit;
            $this->
    bitpos++;
            if ($this->
bitpos==8)        {
                $this->
    blockpos++;
                                if ($this->
    blockpos==$this->
blockmax) //end of block reached            {
                    $this->
    prefetchblock();
            }
                else if ($this->
    blockpos==$this->
blocksize)             {
    //end of short block reached (shorter than blockmax)                return;
//eof             }
                            $this->
    bitpos=0;
        }
            return $b;
    }
    protected function getnextbits($n=1)    {
            $b="";
            for($i=0;
     $i$n;
     $i++)            $b.=$this->
    getnextbit();
            return $b;
    }
    protected function getnextbyte()    {
            if ($this->
    blockpos>
    =$this->
    blocksize)            return;
            $this->
    bitpos=0;
            $b=$this->
    block[$this->
    blockpos+1];
            $this->
    blockpos++;
            return $b;
    }
        //-----------------------------------------------------------------------------    public static function is_layer1(&
$mp3) {
     return ($mp3['Layer Description']=='11');
 }
        public static function is_layer2(&
$mp3) {
     return ($mp3['Layer Description']=='10');
 }
        public static function is_layer3(&
$mp3) {
     return ($mp3['Layer Description']=='01');
 }
        public static function is_mpeg10(&
$mp3)  {
     return ($mp3['MPEG version']=='11');
 }
        public static function is_mpeg20(&
$mp3)  {
     return ($mp3['MPEG version']=='10');
 }
        public static function is_mpeg25(&
$mp3)  {
     return ($mp3['MPEG version']=='00');
 }
        public static function is_mpeg20or25(&
$mp3)  {
 return ($mp3['MPEG version']{
1}
    =='0');
 }
        //-----------------------------------------------------------------------------    public static function bitratelookup(&
$mp3)    {
            //bits               V1,L1  V1,L2  V1,L3  V2,L1  V2,L2&
    L3        $array = array();
            $array['0000']=array('free','free','free','free','free');
            $array['0001']=array(  '32',  '32',  '32',  '32',   '8');
            $array['0010']=array(  '64',  '48',  '40',  '48',  '16');
            $array['0011']=array(  '96',  '56',  '48',  '56',  '24');
            $array['0100']=array( '128',  '64',  '56',  '64',  '32');
            $array['0101']=array( '160',  '80',  '64',  '80',  '40');
            $array['0110']=array( '192',  '96',  '80',  '96',  '48');
            $array['0111']=array( '224', '112',  '96', '112',  '56');
            $array['1000']=array( '256', '128', '112', '128',  '64');
            $array['1001']=array( '288', '160', '128', '144',  '80');
            $array['1010']=array( '320', '192', '160', '160',  '96');
            $array['1011']=array( '352', '224', '192', '176', '112');
            $array['1100']=array( '384', '256', '224', '192', '128');
            $array['1101']=array( '416', '320', '256', '224', '144');
            $array['1110']=array( '448', '384', '320', '256', '160');
            $array['1111']=array( 'bad', 'bad', 'bad', 'bad', 'bad');
                    $whichcolumn=-1;
            if      (mp3file::is_mpeg10($mp3) &
    &
     mp3file::is_layer1($mp3) )//V1,L1            $whichcolumn=0;
            else if (mp3file::is_mpeg10($mp3) &
    &
     mp3file::is_layer2($mp3) )//V1,L2            $whichcolumn=1;
            else if (mp3file::is_mpeg10($mp3) &
    &
     mp3file::is_layer3($mp3) )//V1,L3            $whichcolumn=2;
            else if (mp3file::is_mpeg20or25($mp3) &
    &
     mp3file::is_layer1($mp3) )//V2,L1            $whichcolumn=3;
            else if (mp3file::is_mpeg20or25($mp3) &
    &
     (mp3file::is_layer2($mp3) || mp3file::is_layer3($mp3)) )            $whichcolumn=4;
    //V2,   L2||L3                 if (isset($array[$mp3['Bitrate Index']][$whichcolumn]))            return $array[$mp3['Bitrate Index']][$whichcolumn];
            else             return "bad";
    }
        //-----------------------------------------------------------------------------    public static function samplelookup(&
$mp3)    {
            //bits               MPEG1   MPEG2   MPEG2.5        $array = array();
            $array['00'] =array('44100','22050','11025');
            $array['01'] =array('48000','24000','12000');
            $array['10'] =array('32000','16000','8000');
            $array['11'] =array('res','res','res');
                    $whichcolumn=-1;
            if      (mp3file::is_mpeg10($mp3))            $whichcolumn=0;
            else if (mp3file::is_mpeg20($mp3))            $whichcolumn=1;
            else if (mp3file::is_mpeg25($mp3))            $whichcolumn=2;
                    if (isset($array[$mp3['Sampling Freq Idx']][$whichcolumn]))            return $array[$mp3['Sampling Freq Idx']][$whichcolumn];
            else             return 'unknown';
    }
        //-----------------------------------------------------------------------------    public static function getframesize(&
$mp3)    {
            if ($mp3['Sampling Rate']>
0)        {
                return  ceil((144 * $mp3['Bitrate']*1000)/$mp3['Sampling Rate']) + $mp3['Padding Bit'];
        }
            return 'unknown';
    }
        //-----------------------------------------------------------------------------    public static function getduration(&
$mp3,$startat)    {
            if ($mp3['Bitrate']>
0)        {
                $KBps = ($mp3['Bitrate']*1000)/8;
                $datasize = ($mp3['Filesize'] - ($startat/8));
                $length = $datasize / $KBps;
                return sprintf("%d", $length);
        }
            return "unknown";
    }
    //-----------------------------------------------------------------------------    public static function seconds_to_mmss($duration)    {
            return sprintf("%d:%02d", ($duration /60), $duration %60 );
    }
}
    

调用

?phpinclude_once 'mp3file.class.php';
function mp3Time($file) {
       $m = new mp3file($file);
       $a = $m->
    get_metadata();
       return $a['Length mm:ss'] ? $a['Length mm:ss'] : 0;
}
function mp3Info($file) {
       $m = new mp3file($file);
       return $m->
    get_metadata();
}
    $_time = mp3Time('Beyond-情人.mp3');
echo "歌曲时间长:{
$_time}
    \n";
    $_info = mp3Info('Beyond-情人.mp3');
    print_r($_info);
    

输出信息

→ php mp3.php歌曲时间长:5:15Array(    [Filesize] =>
     7576152    [Encoding] =>
     CBR    [MPEG version] =>
     11    [Layer Description] =>
     01    [Protection Bit] =>
     1    [Bitrate Index] =>
     1011    [Sampling Freq Idx] =>
     00    [Padding Bit] =>
     0    [Private Bit] =>
     0    [Channel Mode] =>
     00    [Mode Extension] =>
     00    [Copyright] =>
     0    [Original Media] =>
     1    [Emphasis] =>
     0    [Bitrate] =>
     192    [Sampling Rate] =>
     44100    [Frame Size] =>
     627    [Length] =>
     315    [Length mm:ss] =>
     5:15)

推荐教程:《php视频教程》

以上就是php获取mp3音频信息实例教程的详细内容,更多请关注其它相关文章!

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: php获取mp3音频信息实例教程
本文地址: https://pptw.com/jishu/596452.html
编程小白学习php必须要了解的事 php实现文件上传到服务器(含代码)

游客 回复需填写必要信息