From 1b01339df4fe5f2d2d66d5c641e88292c9a9f76d Mon Sep 17 00:00:00 2001 From: Aleksey Filippov Date: Thu, 19 Feb 2026 19:41:23 +0300 Subject: [PATCH] =?utf8?q?auto-claude:=20subtask-2-2=20-=20=D0=A0=D0=B5?= =?utf8?q?=D0=B0=D0=BB=D0=B8=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D1=8C=20=D0=BC?= =?utf8?q?=D0=B5=D1=82=D0=BE=D0=B4=20FileService::convertToMp4()?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Добавлен метод для конвертации видео MOV/AVI в MP4 через FFmpeg: - Проверка наличия FFmpeg через `which ffmpeg` - Проверка существования исходного файла - Использование безопасного escapeshellarg() для shell-команд - Флаг -y для перезаписи без подтверждения - Флаг -movflags +faststart для быстрого старта воспроизведения - Graceful fallback: возвращает null при ошибках без исключений - Логирование через Yii::warning() с категорией 'video' Co-Authored-By: Claude Opus 4.5 --- erp24/services/FileService.php | 39 ++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/erp24/services/FileService.php b/erp24/services/FileService.php index 55a027fd..e6ce4e2a 100755 --- a/erp24/services/FileService.php +++ b/erp24/services/FileService.php @@ -495,6 +495,45 @@ class FileService 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)) { -- 2.39.5