• Модуль: sender
  • Путь к файлу: ~/bitrix/modules/sender/lib/integration/voximplant/audio.php
  • Класс: Bitrix\Sender\Integration\VoxImplant\Audio
  • Вызов: Audio::getMp3fileDuration
protected function getMp3fileDuration($fileId)
{
	if (!$fileId)
		return false;

	$fileName = \CFile::GetPath($fileId);

	if ($this->isRemoteFile($fileName))
	{
		$tmpFileName = \CFile::GetTempName('', 'tmpfile.mp3');
		$request = new HttpClient([
			"socketTimeout" => 5,
			"streamTimeout" => 5
		]);
		$request->download($fileName, $tmpFileName);
		$fileName = $tmpFileName;
	}
	else
	{
		$fileName = Application::getDocumentRoot() . $fileName;
	}

	$file = fopen($fileName, "rb");

	$duration = 0;
	$header = fread($file, 100);
	$offset = $this->getId3v2TagLength($header);
	fseek($file, $offset, SEEK_SET);
	while (!feof($file))
	{
		$frame = fread($file, 10);
		if (mb_strlen($frame, 'latin1') < 10)
		{
			break;
		}
		else
		{
			if ("\xff" == $frame[0] && (ord($frame[1]) & 0xe0))  // if 1111 1111 111x xxxx bits (header sequence) was found
			{
				list($frameLength, $frameDuration) = $this->getFrameInfo(mb_substr($frame, 0, 4, 'latin1'));
				if (!$frameLength)
				{
					return $duration;
				}
				$offset = $frameLength - 10;
				$duration += $frameDuration;
			}
			else
			{
				$offset = ('TAG' == mb_substr($frame, 0, 3, 'latin1')) ? 118 : -9;
			}
			fseek($file, $offset, SEEK_CUR);
		}
	}
	return round($duration);
}