Итак, я думаю, что "не очень" решение для новичка в аудио хорошая статья поможет мне БПФ для новичка , затем изучите документацию для Статистика SOX используйте следующий код для получить
- Грубая частота
$z = 0;
$timeFrom = 0;
$freqencies = array();
$fftPoints = 4098/2;
//sox could give only 2048 freqencies spectrum
$file = 'myMp3Test.mp3';// 10 seconds
$interval = 1/8;//1/8 second
//best results I got with this interval smaller gives as well zeros
//80 because 10 seconds interval 1/8 = 80 measurments
while($z <= 80){
$outputexec = '';
exec('sox '.$file.' −n trim '.$timeFrom.' '.$interval.' rate 1024 stat -freq 2>&1', $outputexec);
$timeFrom = $timeFrom + $interval;
$resultLength = (count($outputexec)-12) ;
// - 12 means extra 12 rows in result with stats
$cycles = $resultLength / $fftPoints ;
$x = 1;
while($x<=$cycles){
$buffer = array();
$till = $fftPoints*$x;
$i = $till - $fftPoints;
while($i < $till){
$prA = explode(" ",$outputexec[$i]);
if(isset($prA[1])){ $buffer[] = $prA[1]; }
$i = $i + 1;
}
$maxValue = max($buffer);
$j = ($till>$fftPoints)? $till - $fftPoints: 0;
while($j < $till){
$prB = explode(" ",$outputexec[$j]);
if(isset($prB[1])){
if($prB[1] == $maxValue) {
$freqencies[] = $prB[0];
break;
}
}
$j = $j + 1;
}
$x = $x + 1;
}
$z = $z+1;
}
//result is in freqencies arrray
- Средний объем
exec('ffmpeg -i "'.$file.'" -filter:a volumedetect -f null /dev/null 2>&1', $outputrmsA );
foreach($outputrmsA as $vysledok){
if(preg_match("/mean_volume/", $vysledok)){
$vprenos = explode('mean_volume: ',$vysledok);
$mean_volume = (trim(str_replace(" ", "",(str_replace(" dB", "",$vprenos[1])))));
}
}
var_dump($mean_volume);
- Spectrum, PNG
exec('sox '.$file.' −n rate 4096 spectrogram −z 60 -w Hamming -o aaaaaa/ORG.png');
Я открыт для исправлений или лучших ответов, спасибо за любые советы
Я проверил это на своем личном mp3, и это было с допуском 0,005 ОК