• Модуль: sender
  • Путь к файлу: ~/bitrix/modules/sender/lib/integration/voximplant/audio.php
  • Класс: Bitrix\Sender\Integration\VoxImplant\Audio
  • Вызов: Audio::getFrameInfo
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];
}