Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP MP3提取音量峰值_Php_Mp3 - Fatal编程技术网

PHP MP3提取音量峰值

PHP MP3提取音量峰值,php,mp3,Php,Mp3,假设你有一个mp3文件 是否可以使用PHP提取mp3文件中每个字节的音量级别(设置在0和100之间) 这是我已经有的,它可能会帮助你 function peaks($filename) { if (!file_exists($filename)) { return false; } $bitRates = array( array(0,0,0,0,0), array(

假设你有一个mp3文件

是否可以使用PHP提取mp3文件中每个字节的音量级别(设置在0和100之间)

这是我已经有的,它可能会帮助你

function peaks($filename)
{
    if (!file_exists($filename)) {
        return false;
    }

    $bitRates = array(
                      array(0,0,0,0,0),
                      array(32,32,32,32,8),
                      array(64,48,40,48,16),
                      array(96,56,48,56,24),
                      array(128,64,56,64,32),
                      array(160,80,64,80,40),
                      array(192,96,80,96,48),
                      array(224,112,96,112,56),
                      array(256,128,112,128,64),
                      array(288,160,128,144,80),
                      array(320,192,160,160,96),
                      array(352,224,192,176,112),
                      array(384,256,224,192,128),
                      array(416,320,256,224,144),
                      array(448,384,320,256,160),
                      array(-1,-1,-1,-1,-1),
                    );
    $sampleRates = array(
                         array(11025,12000,8000), //mpeg 2.5
                         array(0,0,0),
                         array(22050,24000,16000), //mpeg 2
                         array(44100,48000,32000), //mpeg 1
                        );
    $bToRead = 1024 * 12;

    $fileData = array('bitRate' => 0, 'sampleRate' => 0, 'bits' => 0);
    $fp = fopen($filename, 'r');
    if (!$fp) {
        return false;
    }
    //seek to 8kb before the end of the file
    fseek($fp, -1 * $bToRead, SEEK_END);
    $data = fread($fp, $bToRead);

    $bytes = unpack('C*', $data);
    $frames = array();
    $lastFrameVerify = null;

    for ($o = 1; $o < count($bytes) - 4; $o++) {

        //http://mpgedit.org/mpgedit/mpeg_format/MP3Format.html
        //header is AAAAAAAA AAABBCCD EEEEFFGH IIJJKLMM
        if (($bytes[$o] & 255) == 255 && ($bytes[$o+1] & 224) == 224) {
            $frame = array();
            $frame['version'] = ($bytes[$o+1] & 24) >> 3; //get BB (0 -> 3)
            $frame['layer'] = abs((($bytes[$o+1] & 6) >> 1) - 4); //get CC (1 -> 3), then invert
            $srIndex = ($bytes[$o+2] & 12) >> 2; //get FF (0 -> 3)
            $brRow = ($bytes[$o+2] & 240) >> 4; //get EEEE (0 -> 15)
            $frame['padding'] = ($bytes[$o+2] & 2) >> 1; //get G
            if ($frame['version'] != 1 && $frame['layer'] > 0 && $srIndex < 3 && $brRow != 15 && $brRow != 0 &&
                (!$lastFrameVerify || $lastFrameVerify === $bytes[$o+1])) {
                //valid frame header

                //calculate how much to skip to get to the next header
                $frame['sampleRate'] = $sampleRates[$frame['version']][$srIndex];
                if ($frame['version'] & 1 == 1) {
                    $frame['bitRate'] = $bitRates[$brRow][$frame['layer']-1]; //v1 and l1,l2,l3
                } else {
                    $frame['bitRate'] = $bitRates[$brRow][($frame['layer'] & 2 >> 1)+3]; //v2 and l1 or l2/l3 (3 is the offset in the arrays)
                }

                if ($frame['layer'] == 1) {
                    $frame['frameLength'] = (12 * $frame['bitRate'] * 1000 / $frame['sampleRate'] + $frame['padding']) * 4;
                } else {
                    $frame['frameLength'] = 144 * $frame['bitRate'] * 1000 / $frame['sampleRate'] + $frame['padding'];
                }

                $frames[] = $frame;
                $lastFrameVerify = $bytes[$o+1];
                $o += floor($frame['frameLength'] - 1);
            } else {
                $frames = array();
                $lastFrameVerify = null;
            }
        }
        if (count($frames) < 3) { //verify at least 3 frames to make sure its an mp3
            continue;
        }

        $header = array_pop($frames);
        $fileData['sampleRate'] = $header['sampleRate'];
        $fileData['bitRate'] = $header['bitRate'];
        $fileData['bits'] = $bytes;
        break;
    }

    return $fileData;
}
函数峰值($filename)
{
如果(!file_存在($filename)){
返回false;
}
$bitRates=数组(
数组(0,0,0,0,0),
数组(32,32,32,32,8),
阵列(64,48,40,48,16),
阵列(96,56,48,56,24),
阵列(128,64,56,64,32),
阵列(160,80,64,80,40),
阵列(192,96,80,96,48),
阵列(224112,96112,56),
阵列(256128112128,64),
阵列(288160128144,80),
阵列(320192160160,96),
阵列(352224192176112),
阵列(384256224192128),
阵列(416320256224144),
阵列(448384320256160),
数组(-1,-1,-1,-1,-1),
);
$sampleRates=数组(
阵列(11025120008000),//mpeg 2.5
数组(0,0,0),
阵列(22050240016000),//mpeg 2
阵列(44100480003200),//mpeg 1
);
$bToRead=1024*12;
$fileData=array('bitRate'=>0,'sampleRate'=>0,'bits'=>0);
$fp=fopen($filename,'r');
如果(!$fp){
返回false;
}
//在文件结尾之前查找8kb
fseek($fp,-1*$b向前,搜索结束);
$data=fread($fp,$bToRead);
$bytes=unpack('C*',$data);
$frames=array();
$lastFrameVerify=null;
对于($o=1;$o>3;//获取BB(0->3)
$frame['layer']=abs(($bytes[$o+1]&6)>>1)-4;//获取CC(1->3),然后反转
$srIndex=($bytes[$o+2]&12)>>2;//获取FF(0->3)
$brRow=($bytes[$o+2]&240)>>4;//获取EEEE(0->15)
$frame['padding']=($bytes[$o+2]&2)>>1;//获取G
如果($frame['version'!=1&&$frame['layer']>0&&$srIndex<3&&$brRow!=15&&$brRow!=0&&
(!$lastFrameVerify | |$lastFrameVerify===$bytes[$o+1])){
//有效帧头
//计算跳转到下一个标题的次数
$frame['sampleRate']=$sampleRates[$frame['version']][$srIndex];
if($frame['version']&1==1){
$frame['bitRate']=$bitRates[$brRow][$frame['layer']-1];//v1和l1、l2、l3
}否则{
$frame['bitRate']=$bitRates[$brRow][($frame['layer']&2>>1)+3];//v2和l1或l2/l3(3是数组中的偏移量)
}
如果($frame['layer']==1){
$frame['frameLength']=(12*$frame['bitRate']*1000/$frame['sampleRate']+$frame['padding'])*4;
}否则{
$frame['frameLength']=144*$frame['bitRate']*1000/$frame['sampleRate']+$frame['padding'];
}
$frames[]=$frames;
$lastFrameVerify=$bytes[$o+1];
$o+=地板($frame['frameLength']-1);
}否则{
$frames=array();
$lastFrameVerify=null;
}
}
如果(计数($frames)<3){//请验证至少3帧,以确保它是mp3
继续;
}
$header=array\u pop($frames);
$fileData['sampleRate']=$header['sampleRate'];
$fileData['bitRate']=$header['bitRate'];
$fileData['bits']=$bytes;
打破
}
返回$fileData;
}

如果这样做有效,它将用于从mp3文件生成波形。

这个类也可以是一个很好的起点:

此处的用例:

您有什么解决方案吗