return $uploaded;
}
+ /**
+ * Конвертирует видео в MP4 через FFmpeg.
+ * Возвращает путь к MP4 или null при ошибке/отсутствии FFmpeg.
+ *
+ * @param string $sourcePath Путь к исходному видеофайлу (MOV, AVI)
+ * @param string $targetPath Путь для сохранения MP4 файла
+ * @return string|null Путь к сконвертированному MP4 или null при ошибке
+ */
+ public static function convertToMp4(string $sourcePath, string $targetPath): ?string
+ {
+ // Проверяем наличие FFmpeg
+ exec('which ffmpeg 2>/dev/null', $output, $returnCode);
+ if ($returnCode !== 0) {
+ Yii::warning('FFmpeg не установлен, конвертация пропущена: ' . $sourcePath, 'video');
+ return null;
+ }
+
+ // Проверяем существование исходного файла
+ if (!file_exists($sourcePath)) {
+ Yii::warning('Исходный файл не найден: ' . $sourcePath, 'video');
+ return null;
+ }
+
+ // Формируем команду FFmpeg
+ $cmd = sprintf(
+ 'ffmpeg -y -i %s -vcodec h264 -acodec aac -movflags +faststart %s 2>/dev/null',
+ escapeshellarg($sourcePath),
+ escapeshellarg($targetPath)
+ );
+ exec($cmd, $cmdOutput, $returnCode);
+
+ if ($returnCode === 0 && file_exists($targetPath)) {
+ return $targetPath;
+ }
+
+ Yii::warning('Ошибка конвертации FFmpeg: ' . $sourcePath, 'video');
+ return null;
+ }
+
public static function saveFromUrlToUploads(string $url, int $adminId): ?array
{
if (!filter_var($url, FILTER_VALIDATE_URL)) {