PHP code example of pbmedia / laravel-ffmpeg
1. Go to this page and download the library: Download pbmedia/laravel-ffmpeg 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/ */
pbmedia / laravel-ffmpeg example snippets
// config/app.php
'providers' => [
...
ProtoneMedia\LaravelFFMpeg\Support\ServiceProvider::class,
...
];
'aliases' => [
...
'FFMpeg' => ProtoneMedia\LaravelFFMpeg\Support\FFMpeg::class
...
];
FFMpeg::fromDisk('songs')
->open('yesterday.mp3')
->export()
->toDisk('converted_songs')
->inFormat(new \FFMpeg\Format\Audio\Aac)
->save('yesterday.aac');
$media = FFMpeg::fromFilesystem($filesystem)->open('yesterday.mp3');
FFMpeg::open('steve_howe.mp4')
->export()
->onProgress(function ($percentage) {
echo "{$percentage}% transcoded";
});
FFMpeg::open('steve_howe.mp4')
->export()
->onProgress(function ($percentage, $remaining, $rate) {
echo "{$remaining} seconds left at rate: {$rate}";
});
class UploadVideoController
{
public function __invoke(Request $request)
{
FFMpeg::open($request->file('video'));
}
}
FFMpeg::openUrl('https://videocoursebuilder.com/lesson-1.mp4');
FFMpeg::openUrl('https://videocoursebuilder.com/lesson-2.mp4', [
'Authorization' => 'Basic YWRtaW46MTIzNA==',
]);
try {
FFMpeg::open('yesterday.mp3')
->export()
->inFormat(new Aac)
->save('yesterday.aac');
} catch (EncodingException $exception) {
$command = $exception->getCommand();
$errorLog = $exception->getErrorOutput();
}
use FFMpeg\Filters\Video\VideoFilters;
FFMpeg::fromDisk('videos')
->open('steve_howe.mp4')
->addFilter(function (VideoFilters $filters) {
$filters->resize(new \FFMpeg\Coordinate\Dimension(640, 480));
})
->export()
->toDisk('converted_videos')
->inFormat(new \FFMpeg\Format\Video\X264)
->save('small_steve.mkv');
// or
$start = \FFMpeg\Coordinate\TimeCode::fromSeconds(5)
$clipFilter = new \FFMpeg\Filters\Video\ClipFilter($start);
FFMpeg::fromDisk('videos')
->open('steve_howe.mp4')
->addFilter($clipFilter)
->export()
->toDisk('converted_videos')
->inFormat(new \FFMpeg\Format\Video\X264)
->save('short_steve.mkv');
use FFMpeg\Filters\Video\VideoFilters;
FFMpeg::fromDisk('videos')
->open('steve_howe.mp4')
->export()
->toDisk('converted_videos')
->inFormat(new \FFMpeg\Format\Video\X264)
->addFilter(function (VideoFilters $filters) {
$filters->resize(new \FFMpeg\Coordinate\Dimension(640, 480));
})
->save('small_steve.mkv');
FFMpeg::open('steve_howe.mp4')
->export()
->inFormat(new \FFMpeg\Format\Video\X264)
->resize(640, 480)
->save('steve_howe_resized.mp4');
FFMpeg::fromDisk('videos')
->open('steve_howe.mp4')
->addFilter(['-itsoffset', 1]);
// or
FFMpeg::fromDisk('videos')
->open('steve_howe.mp4')
->addFilter('-itsoffset', 1);
use ProtoneMedia\LaravelFFMpeg\Filters\WatermarkFactory;
FFMpeg::fromDisk('videos')
->open('steve_howe.mp4')
->addWatermark(function(WatermarkFactory $watermark) {
$watermark->fromDisk('local')
->open('logo.png')
->right(25)
->bottom(25);
});
FFMpeg::open('steve_howe.mp4')
->addWatermark(function(WatermarkFactory $watermark) {
$watermark->open('logo.png')
->horizontalAlignment(WatermarkFactory::LEFT, 25)
->verticalAlignment(WatermarkFactory::TOP, 25);
});
FFMpeg::open('steve_howe.mp4')
->addWatermark(function(WatermarkFactory $watermark) {
$watermark->openUrl('https://videocoursebuilder.com/logo.png');
// or
$watermark->openUrl('https://videocoursebuilder.com/logo.png', [
'Authorization' => 'Basic YWRtaW46MTIzNA==',
]);
});
$watermark->openUrl('https://videocoursebuilder.com/logo.png', [
'Authorization' => 'Basic YWRtaW46MTIzNA==',
], function($curl) {
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
});
FFMpeg::open('steve_howe.mp4')
->addWatermark(function(WatermarkFactory $watermark) {
$watermark->open('logo.png')
->right(25)
->bottom(25)
->width(100)
->height(100)
->greyscale();
});
use ProtoneMedia\LaravelFFMpeg\FFMpeg\CopyFormat;
FFMpeg::open('video.mp4')
->export()
->inFormat(new CopyFormat)
->save('video.mkv');
// The 'fromDisk()' method is not sk', as specified in
// the config file.
FFMpeg::open('my_movie.mov')
// export to FTP, converted in WMV
->export()
->toDisk('ftp')
->inFormat(new \FFMpeg\Format\Video\WMV)
->save('my_movie.wmv')
// export to Amazon S3, converted in X264
->export()
->toDisk('s3')
->inFormat(new \FFMpeg\Format\Video\X264)
->save('my_movie.mkv');
// you could even discard the 'toDisk()' method,
// now the converted file will be saved to
// the same disk as the source!
->export()
->inFormat(new FFMpeg\Format\Video\WebM)
->save('my_movie.webm')
// optionally you could set the visibility
// of the exported file
->export()
->inFormat(new FFMpeg\Format\Video\WebM)
->withVisibility('public')
->save('my_movie.webm')
FFMpeg::fromDisk('videos')
->open('steve_howe.mp4')
->getFrameFromSeconds(10)
->export()
->toDisk('thumnails')
->save('FrameAt10sec.png');
// Instead of the 'getFrameFromSeconds()' method, you could
// also use the 'getFrameFromString()' or the
// 'getFrameFromTimecode()' methods:
$media = FFMpeg::open('steve_howe.mp4');
$frame = $media->getFrameFromString('00:00:13.37');
// or
$timecode = new FFMpeg\Coordinate\TimeCode(...);
$frame = $media->getFrameFromTimecode($timecode);
$contents = FFMpeg::open('video.mp4')
->getFrameFromSeconds(2)
->export()
->getFrameContents();
FFMpeg::open('video.mp4')
->exportFramesByInterval(2)
->save('thumb_%05d.jpg');
FFMpeg::open('video.mp4')
->exportFramesByAmount(10, 320, 180)
->save('thumb_%05d.png');
FFMpeg::open('video.mp4')
->exportFramesByInterval(2, 640, 360, 5)
->save('thumb_%05d.jpg');
use ProtoneMedia\LaravelFFMpeg\Filters\TileFactory;
FFMpeg::open('steve_howe.mp4')
->exportTile(function (TileFactory $factory) {
$factory->interval(5)
->scale(160, 90)
->grid(3, 5);
})
->save('tile_%05d.jpg');
FFMpeg::open('steve_howe.mp4')
->exportTile(function (TileFactory $factory) {
$factory->interval(10)
->scale(320, 180)
->grid(5, 5)
->generateVTT('thumbnails.vtt');
})
->save('tile_%05d.jpg');
$mediaOpener = FFMpeg::open('video.mp4');
foreach ([5, 15, 25] as $key => $seconds) {
$mediaOpener = $mediaOpener->getFrameFromSeconds($seconds)
->export()
->save("thumb_{$key}.png");
}
FFMpeg::open('video.mp4')->each([5, 15, 25], function ($ffmpeg, $seconds, $key) {
$ffmpeg->getFrameFromSeconds($seconds)->export()->save("thumb_{$key}.png");
});
FFMpeg::open('feature_%04d.png')
->export()
->asTimelapseWithFramerate(1)
->inFormat(new X264)
->save('timelapse.mp4');
FFMpeg::open('video1.mp4')->open('video2.mp4');
FFMpeg::open(['video1.mp4', 'video2.mp4']);
FFMpeg::fromDisk('uploads')
->open('video1.mp4')
->fromDisk('archive')
->open('video2.mp4');
FFMpeg::fromDisk('local')
->open(['video.mp4', 'audio.m4a'])
->export()
->addFormatOutputMapping(new X264, Media::make('local', 'new_video.mp4'), ['0:v', '1:a'])
->save();
// This code takes 2 input videos, stacks they horizontally in 1 output video and
// adds to this new video the audio from the first video. (It is impossible
// with a simple filter graph that has only 1 input and only 1 output).
FFMpeg::fromDisk('local')
->open(['video.mp4', 'video2.mp4'])
->export()
->addFilter('[0:v][1:v]', 'hstack', '[v]') // $in, $parameters, $out
->addFormatOutputMapping(new X264, Media::make('local', 'stacked_video.mp4'), ['0:a', '[v]'])
->save();
use FFMpeg\Filters\AdvancedMedia\ComplexFilters;
FFMpeg::open(['video.mp4', 'video2.mp4'])
->export()
->addFilter(function(ComplexFilters $filters) {
// $filters->watermark(...);
});
FFMpeg::openUrl([
'https://videocoursebuilder.com/lesson-3.mp4',
'https://videocoursebuilder.com/lesson-4.mp4',
]);
FFMpeg::openUrl([
'https://videocoursebuilder.com/lesson-3.mp4',
'https://videocoursebuilder.com/lesson-4.mp4',
], [
'Authorization' => 'Basic YWRtaW46MTIzNA==',
]);
FFMpeg::openUrl('https://videocoursebuilder.com/lesson-5.mp4', [
'Authorization' => 'Basic YWRtaW46MTIzNA==',
])->openUrl('https://videocoursebuilder.com/lesson-6.mp4', [
'Authorization' => 'Basic bmltZGE6NDMyMQ==',
]);
FFMpeg::fromDisk('local')
->open(['video.mp4', 'video2.mp4'])
->export()
->concatWithoutTranscoding()
->save('concat.mp4');
FFMpeg::fromDisk('local')
->open(['video.mp4', 'video2.mp4'])
->export()
->inFormat(new X264)
->concatWithTranscoding($hasVideo = true, $hasAudio = true)
->save('concat.mp4');
$media = FFMpeg::open('wwdc_2006.mp4');
$durationInSeconds = $media->getDurationInSeconds(); // returns an int
$durationInMiliseconds = $media->getDurationInMiliseconds(); // returns a float
FFMpeg::cleanupTemporaryFiles();
$lowBitrate = (new X264)->setKiloBitrate(250);
$midBitrate = (new X264)->setKiloBitrate(500);
$highBitrate = (new X264)->setKiloBitrate(1000);
FFMpeg::fromDisk('videos')
->open('steve_howe.mp4')
->exportForHLS()
->setSegmentLength(10) // optional
->setKeyFrameInterval(48) // optional
->addFormat($lowBitrate)
->addFormat($midBitrate)
->addFormat($highBitrate)
->save('adaptive_steve.m3u8');
$lowBitrate = (new X264)->setKiloBitrate(250);
$midBitrate = (new X264)->setKiloBitrate(500);
$highBitrate = (new X264)->setKiloBitrate(1000);
$superBitrate = (new X264)->setKiloBitrate(1500);
FFMpeg::open('steve_howe.mp4')
->exportForHLS()
->addFormat($lowBitrate, function($media) {
$media->addFilter('scale=640:480');
})
->addFormat($midBitrate, function($media) {
$media->scale(960, 720);
})
->addFormat($highBitrate, function ($media) {
$media->addFilter(function ($filters, $in, $out) {
$filters->custom($in, 'scale=1920:1200', $out); // $in, $parameters, $out
});
})
->addFormat($superBitrate, function($media) {
$media->addLegacyFilter(function ($filters) {
$filters->resize(new \FFMpeg\Coordinate\Dimension(2560, 1920));
});
})
->save('adaptive_steve.m3u8');
FFMpeg::fromDisk('videos')
->open('steve_howe.mp4')
->exportForHLS()
->useSegmentFilenameGenerator(function ($name, $format, $key, callable $segments, callable $playlist) {
$segments("{$name}-{$format->getKiloBitrate()}-{$key}-%03d.ts");
$playlist("{$name}-{$format->getKiloBitrate()}-{$key}.m3u8");
});
use ProtoneMedia\LaravelFFMpeg\Exporters\HLSExporter;
$encryptionKey = HLSExporter::generateEncryptionKey();
FFMpeg::open('steve_howe.mp4')
->exportForHLS()
->withEncryptionKey($encryptionKey)
->addFormat($lowBitrate)
->addFormat($midBitrate)
->addFormat($highBitrate)
->save('adaptive_steve.m3u8');
FFMpeg::open('steve_howe.mp4')
->exportForHLS()
->withRotatingEncryptionKey(function ($filename, $contents) {
$videoId = 1;
// use this callback to store the encryption keys
Storage::disk('secrets')->put($videoId . '/' . $filename, $contents);
// or...
DB::table('hls_secrets')->insert([
'video_id' => $videoId,
'filename' => $filename,
'contents' => $contents,
]);
})
->addFormat($lowBitrate)
->addFormat($midBitrate)
->addFormat($highBitrate)
->save('adaptive_steve.m3u8');
FFMpeg::open('steve_howe.mp4')
->exportForHLS()
->withRotatingEncryptionKey($callable, 10);
// config/laravel-ffmpeg.php
return [
'temporary_files_encrypted_hls' => '/dev/shm'
];
Route::get('/video/secret/{key}', function ($key) {
return Storage::disk('secrets')->download($key);
})->name('video.key');
Route::get('/video/{playlist}', function ($playlist) {
return FFMpeg::dynamicHLSPlaylist()
->fromDisk('public')
->open($playlist)
->setKeyUrlResolver(function ($key) {
return route('video.key', ['key' => $key]);
})
->setMediaUrlResolver(function ($mediaFilename) {
return Storage::disk('public')->url($mediaFilename);
})
->setPlaylistUrlResolver(function ($playlistFilename) {
return route('video.playlist', ['playlist' => $playlistFilename]);
});
})->name('video.playlist');
$processOutput = FFMpeg::open('video.mp4')
->export()
->addFilter(['-filter:a', 'volumedetect', '-f', 'null'])
->getProcessOutput();
$processOutput->all();
$processOutput->errors();
$processOutput->out();
// This gives you an instance of ProtoneMedia\LaravelFFMpeg\MediaOpener
$media = FFMpeg::fromDisk('videos')->open('video.mp4');
// The 'getStreams' method will be called on the underlying Media object since
// it doesn't exists on this object.
$codec = $media->getStreams()->first()->get('codec_name');
// This gives you an instance of ProtoneMedia\LaravelFFMpeg\MediaOpener
$media = FFMpeg::fromDisk('videos')->open('video.mp4');
// This gives you an instance of FFMpeg\Media\MediaTypeInterface
$baseMedia = $media();
use FFMpeg\Format\ProgressListener\AbstractProgressListener;
use ProtoneMedia\LaravelFFMpeg\FFMpeg\ProgressListenerDecorator;
$format = new \FFMpeg\Format\Video\X264;
$decoratedFormat = ProgressListenerDecorator::decorate($format);
FFMpeg::open('video.mp4')
->export()
->inFormat($decoratedFormat)
->onProgress(function () use ($decoratedFormat) {
$listeners = $decoratedFormat->getListeners(); // array of listeners
$listener = $listeners[0]; // instance of AbstractProgressListener
$listener->getCurrentPass();
$listener->getTotalPass();
$listener->getCurrentTime();
})
->save('new_video.mp4');
FFMpeg::open('video.mp4')
->export()
->inFormat(new X264)
->beforeSaving(function ($commands) {
$commands[] = '-hello';
return $commands;
})
->save('concat.mp4');
app.php
bash
php artisan vendor:publish --provider="ProtoneMedia\LaravelFFMpeg\Support\ServiceProvider"