private function getFrameInfo($frame)
{
$versions = [0 => '2.5', 2 => '2', 3 => '1'];
$layers = [1 => '3', 2 => '2', 3 => '1'];
$bitrates = [
1 => [
1 => [0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448],
2 => [0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384],
3 => [0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320]
],
2 => [
1 => [0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256],
2 => [0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160],
3 => [0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160],
]
];
$sampleRates = [
'1' => [44100, 48000, 32000],
'2' => [22050, 24000, 16000],
'2.5' => [11025, 12000, 8000]
];
$samples = [
1 => [1 => 384, 2 => 1152, 3 => 1152],
2 => [1 => 384, 2 => 1152, 3 => 576]
];
$layerData = ord($frame[1]);
$rateData = ord($frame[2]);
$version = $versions[($layerData & 0x18) >> 3];
$bitrateVersion = ($version == '2.5' ? 2 : $version);
$layer = $layers[($layerData & 0x06) >> 1];
$bitrateIndex = ($rateData & 0xf0) >> 4;
$bitrate = $bitrates[$bitrateVersion][$layer][$bitrateIndex] ?: 0;
$sampleRateIndex = ($rateData & 0x0c) >> 2;//0xc => b1100
$sampleRate = $sampleRates[$version][$sampleRateIndex] ?: 0;
$padding = ($rateData & 0x02) >> 1;
if ($sampleRate <> 0)
{
$duration = $samples[$bitrateVersion][$layer] / $sampleRate;
}
if ($layer == 1)
{
$frameLength = intval(((12 * $bitrate * 1000 / $sampleRate) + $padding) * 4);
}
else
{
$frameLength = intval(((144 * $bitrate * 1000) / $sampleRate) + $padding);
}
return [$frameLength, $duration ?? 0];
}