PHP code example of christyoga123 / video-optimizer
1. Go to this page and download the library: Download christyoga123/video-optimizer library . Choose the download type require .
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
christyoga123 / video-optimizer example snippets
use Christyoga123\VideoOptimizer\VideoOptimizer;
// Process uploaded file and get optimized temp path
$tempPath = VideoOptimizer::make()
->toMp4()
->maxDimensions(1920, 1080)
->videoBitrate(1500)
->process($uploadedFile);
// Do something with the optimized file
Storage::disk('public')->put('videos/video.mp4', file_get_contents($tempPath));
use Christyoga123\VideoOptimizer\Facades\VideoOptimizer;
$tempPath = VideoOptimizer::make()
->toMp4()
->crf(23)
->preset('fast')
->process($request->file('video'));
$tempPath = VideoOptimizer::make()
->toWebm()
->videoBitrate(2000)
->processFromRequest('video');
if ($tempPath) {
// File was uploaded and processed
$post->update(['video' => Storage::putFile('videos', $tempPath)]);
}
$tempPath = VideoOptimizer::make()
->toMp4()
->maxDimensions(1280, 720)
->crf(28)
->processFromPath('/path/to/original/video.mov');
$tempPath = VideoOptimizer::make()
->withDefaults()
->process($uploadedFile);
$optimizer = VideoOptimizer::make()
->toMp4()
->withThumbnail(5); // Capture at 5 seconds
$videoPath = $optimizer->process($uploadedFile);
$thumbnailPath = $optimizer->getThumbnailPath();
// Store both video and thumbnail
Storage::disk('public')->put('videos/video.mp4', file_get_contents($videoPath));
Storage::disk('public')->put('thumbnails/thumb.jpg', file_get_contents($thumbnailPath));
$tempPath = VideoOptimizer::make()
->toMp4()
->noAudio()
->process($uploadedFile);
$optimizer = VideoOptimizer::make();
// Get video info before processing
$info = $optimizer->getVideoInfo($uploadedFile->getRealPath());
// Result:
// [
// 'duration' => 120.5,
// 'bitrate' => 2500000,
// 'size' => 37500000,
// 'format' => 'mov,mp4,m4a,3gp,3g2,mj2',
// 'width' => 1920,
// 'height' => 1080,
// 'video_codec' => 'h264',
// 'audio_codec' => 'aac',
// 'frame_rate' => '30/1',
// ]
$optimizer = VideoOptimizer::make()
->toMp4()
->crf(28)
->maxDimensions(1280, 720);
$tempPath = $optimizer->process($uploadedFile);
$comparison = $optimizer->getSizeComparison($uploadedFile->getRealPath());
// Result:
// [
// 'original_size' => 50000000,
// 'optimized_size' => 12500000,
// 'saved_bytes' => 37500000,
// 'saved_percentage' => 75.0
// ]
echo "Saved: " . $optimizer->formatFileSize($comparison['saved_bytes']);
// Output: "Saved: 35.76 MB"
$optimizer = VideoOptimizer::make();
// Get sanitized filename for storage
$filename = $optimizer->getOptimizedFilename($uploadedFile);
// "my_video.mp4"
// Get current format
$format = $optimizer->getFormat();
// "mp4"
// Get temp file path
$path = $optimizer->getTempPath();
// Get thumbnail path (if generated)
$thumbnail = $optimizer->getThumbnailPath();
// Get video duration
$duration = $optimizer->getDuration($uploadedFile->getRealPath());
// Get video dimensions
$dimensions = $optimizer->getDimensions($uploadedFile->getRealPath());
// ['width' => 1920, 'height' => 1080]
// Manual cleanup (usually not needed - destructor handles this)
$optimizer->cleanup();
return [
// FFmpeg binary paths (null = auto-detect)
'ffmpeg_path' => env('VIDEO_OPTIMIZER_FFMPEG_PATH', null),
'ffprobe_path' => env('VIDEO_OPTIMIZER_FFPROBE_PATH', null),
// Processing timeout in seconds
'timeout' => env('VIDEO_OPTIMIZER_TIMEOUT', 3600),
// Number of threads (0 = auto)
'threads' => env('VIDEO_OPTIMIZER_THREADS', 0),
// Default output format
'format' => env('VIDEO_OPTIMIZER_FORMAT', 'mp4'),
// Default codecs
'video_codec' => env('VIDEO_OPTIMIZER_VIDEO_CODEC', 'libx264'),
'audio_codec' => env('VIDEO_OPTIMIZER_AUDIO_CODEC', 'aac'),
// Default bitrates
'video_bitrate' => env('VIDEO_OPTIMIZER_VIDEO_BITRATE', 1500),
'audio_bitrate' => env('VIDEO_OPTIMIZER_AUDIO_BITRATE', 128),
// Default max dimensions
'max_width' => env('VIDEO_OPTIMIZER_MAX_WIDTH', 1920),
'max_height' => env('VIDEO_OPTIMIZER_MAX_HEIGHT', 1080),
// CRF (Constant Rate Factor) - lower = better quality
'crf' => env('VIDEO_OPTIMIZER_CRF', 23),
// Encoding preset
'preset' => env('VIDEO_OPTIMIZER_PRESET', 'medium'),
// Temporary directory
'temp_dir' => env('VIDEO_OPTIMIZER_TEMP_DIR', storage_path('app/temp')),
// Thumbnail generation
'generate_thumbnail' => env('VIDEO_OPTIMIZER_GENERATE_THUMBNAIL', false),
'thumbnail_time' => env('VIDEO_OPTIMIZER_THUMBNAIL_TIME', 1),
];
VideoOptimizer::make()
->toMp4()
->crf(23)
->preset('medium')
->maxDimensions(1920, 1080)
->process($file);
VideoOptimizer::make()
->toMp4()
->crf(28)
->preset('slow')
->maxDimensions(1280, 720)
->videoBitrate(1000)
->process($file);
VideoOptimizer::make()
->toMp4()
->crf(18)
->preset('slower')
->videoBitrate(4000)
->process($file);
VideoOptimizer::make()
->toMp4()
->preset('ultrafast')
->process($file);
use Christyoga123\VideoOptimizer\VideoOptimizer;
// Optimize before adding to media collection
$tempPath = VideoOptimizer::make()
->toMp4()
->maxDimensions(1920, 1080)
->crf(23)
->process($request->file('video'));
$model->addMedia($tempPath)
->usingFileName('optimized-video.mp4')
->toMediaCollection('videos');
$optimizer = VideoOptimizer::make()
->toMp4()
->crf(23)
->withThumbnail(3);
$tempPath = $optimizer->process($request->file('video'));
$filename = $optimizer->getOptimizedFilename($request->file('video'));
// Store video
$videoPath = Storage::disk('public')->putFileAs('uploads/videos', $tempPath, $filename);
// Store thumbnail
$thumbnailFilename = pathinfo($filename, PATHINFO_FILENAME) . '.jpg';
$thumbnailPath = Storage::disk('public')->putFileAs('uploads/thumbnails', $optimizer->getThumbnailPath(), $thumbnailFilename);
return response()->json([
'video' => $videoPath,
'thumbnail' => $thumbnailPath,
]);
// app/Http/Requests/StoreVideoRequest.php
public function passedValidation()
{
if ($this->hasFile('video')) {
$optimizer = VideoOptimizer::make()
->withDefaults()
->withThumbnail(1);
$tempPath = $optimizer->process($this->file('video'));
$this->merge([
'optimized_video_path' => $tempPath,
'thumbnail_path' => $optimizer->getThumbnailPath(),
]);
}
}
}
}
use Christyoga123\VideoOptimizer\Jobs\OptimizeVideoJob;
// Dispatch job
OptimizeVideoJob::dispatch(
$sourcePath, // Full path to source file
$destinationPath, // Full path to save result (optional, overwrites source if null)
[ // Options array
'format' => 'mp4',
'crf' => 23,
'preset' => 'fast'
],
true // Delete source file after optimization? (default: false)
);
$optimizer = VideoOptimizer::make()
->toMp4()
->dontCleanup() // Prevent auto-deletion
->process($file);
// ... do something time consuming ...
// Manually cleanup when done
$optimizer->cleanup();
// app/Jobs/OptimizeVideo.php
class OptimizeVideo implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public function __construct(
public string $videoPath,
public int $postId
) {}
public function handle(): void
{
$optimizer = VideoOptimizer::make()
->toMp4()
->crf(23)
->maxDimensions(1920, 1080)
->withThumbnail(3);
$tempPath = $optimizer->processFromPath($this->videoPath);
// Store optimized video
$filename = 'video_' . $this->postId . '.mp4';
Storage::disk('public')->put('videos/' . $filename, file_get_contents($tempPath));
// Store thumbnail
$thumbFilename = 'thumb_' . $this->postId . '.jpg';
Storage::disk('public')->put('thumbnails/' . $thumbFilename, file_get_contents($optimizer->getThumbnailPath()));
// Update post
Post::find($this->postId)->update([
'video_path' => 'videos/' . $filename,
'thumbnail_path' => 'thumbnails/' . $thumbFilename,
'video_processed' => true,
]);
// Delete original file
@unlink($this->videoPath);
}
}
bash
php artisan vendor:publish --tag=video-optimizer-config