video = $video; } public function handle() { $video = $this->video; // Get original file path $originalPath = storage_path('app/' . $video->path); if (!file_exists($originalPath)) { Log::error('CompressVideoJob: Original file not found: ' . $originalPath); return; } // Create compressed filename $compressedFilename = 'compressed_' . $video->filename; $compressedPath = storage_path('app/public/videos/' . $compressedFilename); try { $ffmpeg = FFMpeg::create(); $ffmpegVideo = $ffmpeg->open($originalPath); // Use CRF 18 for high quality (lower = better quality, 18-23 is good range) // Use 'slow' preset for better compression efficiency $format = new X264('aac', 'libx264'); $format->setKiloBitrate(0); // 0 = use CRF $format->setAudioKiloBitrate(192); // Add CRF option for high quality $ffmpegVideo->save($format, $compressedPath); // Check if compressed file was created and is smaller if (file_exists($compressedPath)) { $originalSize = filesize($originalPath); $compressedSize = filesize($compressedPath); // Only use compressed file if it's smaller if ($compressedSize < $originalSize) { // Delete original and rename compressed unlink($originalPath); rename($compressedPath, $originalPath); // Update video record $video->update([ 'size' => $compressedSize, 'filename' => $video->filename, // Keep same filename 'mime_type' => 'video/mp4', ]); Log::info('CompressVideoJob: Video compressed successfully', [ 'video_id' => $video->id, 'original_size' => $originalSize, 'compressed_size' => $compressedSize, 'saved' => round(($originalSize - $compressedSize) / $originalSize * 100) . '%' ]); } else { // Compressed file is larger, delete it unlink($compressedPath); Log::info('CompressVideoJob: Compression made file larger, keeping original'); } } $video->update(['status' => 'ready']); } catch (\Exception $e) { Log::error('CompressVideoJob failed: ' . $e->getMessage()); $video->update(['status' => 'ready']); // Mark as ready anyway } } }