2017 © Pedro Peláez
 

library laravel-ffmpeg

FFMpeg for Laravel

image

mronx/laravel-ffmpeg

FFMpeg for Laravel

  • Monday, June 11, 2018
  • by uz
  • Repository
  • 1 Watchers
  • 0 Stars
  • 6 Installations
  • PHP
  • 0 Dependents
  • 0 Suggesters
  • 33 Forks
  • 0 Open issues
  • 27 Versions
  • 0 % Grown

The README.md

Laravel FFMpeg

Latest Version on Packagist Software License Build Status Quality Score Total Downloads, (*1)

This package provides an integration with FFmpeg for Laravel 5.6. The storage of the files is handled by Laravel's Filesystem., (*2)

Features

Installation

This version of the package is only compatible with Laravel 5.6. If you're still using Laravel 5.1 - 5.5, please use version 1.3 (which is not maintained anymore)., (*3)

You can install the package via composer:, (*4)

``` bash composer require mronx/laravel-ffmpeg, (*5)


Add the Service Provider and Facade to your ```app.php``` config file if you're not using Package Discovery. ``` php // Laravel 5: config/app.php 'providers' => [ ... Mronx\LaravelFFMpeg\FFMpegServiceProvider::class, ... ]; 'aliases' => [ ... 'FFMpeg' => Mronx\LaravelFFMpeg\FFMpegFacade::class ... ];

Publish the config file using the artisan CLI tool:, (*6)

``` bash php artisan vendor:publish --provider="Mronx\LaravelFFMpeg\FFMpegServiceProvider", (*7)


## Usage Convert an audio or video file: ``` php FFMpeg::fromDisk('songs') ->open('yesterday.mp3') ->export() ->toDisk('converted_songs') ->inFormat(new \FFMpeg\Format\Audio\Aac) ->save('yesterday.aac');

Instead of the fromDisk() method you can also use the fromFilesystem() method, where $filesystem is an instance of Illuminate\Contracts\Filesystem\Filesystem., (*8)

``` php $media = FFMpeg::fromFilesystem($filesystem)->open('yesterday.mp3');, (*9)


You can add filters through a ```Closure``` or by using PHP-FFMpeg's Filter objects: ``` php FFMpeg::fromDisk('videos') ->open('steve_howe.mp4') ->addFilter(function ($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');

Sometimes you don't want to use the built-in filters. You can apply your own filter by providing a set of options. This can be an array or multiple strings as arguments:, (*10)

``` php FFMpeg::fromDisk('videos') ->open('steve_howe.mp4') ->addFilter(['-itsoffset', 1]);, (*11)

// or, (*12)

FFMpeg::fromDisk('videos') ->open('steve_howe.mp4') ->addFilter('-itsoffset', 1);, (*13)


Chain multiple convertions: ``` php // The 'fromDisk()' method is not required, the file will now // be opened from the default 'disk', 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')

Create a frame from a video:, (*14)

``` php FFMpeg::fromDisk('videos') ->open('steve_howe.mp4') ->getFrameFromSeconds(10) ->export() ->toDisk('thumnails') ->save('FrameAt10sec.png');, (*15)

// Instead of the 'getFrameFromSeconds()' method, you could // also use the 'getFrameFromString()' or the // 'getFrameFromTimecode()' methods:, (*16)

$media = FFMpeg::open('steve_howe.mp4'); $frame = $media->getFrameFromString('00:00:13.37');, (*17)

// or, (*18)

$timecode = new FMpeg\Coordinate\TimeCode(...); $frame = $media->getFrameFromTimecode($timecode);, (*19)


With the ```Media``` class you can determinate the duration of a file: ``` php $media = FFMpeg::open('wwdc_2006.mp4'); $durationInSeconds = $media->getDurationInSeconds(); // returns an int $durationInMiliseconds = $media->getDurationInMiliseconds(); // returns a float

When opening or saving files from or to a remote disk, temporary files will be created on your server. After you're done exporting or processing these files, you could clean them up by calling the cleanupTemporaryFiles() method:, (*20)

``` php FFMpeg::cleanupTemporaryFiles();, (*21)


## HLS You can create a M3U8 playlist to do [HLS](https://en.wikipedia.org/wiki/HTTP_Live_Streaming). Exporting is currently only supported on local disks. ``` php $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 ->addFormat($lowBitrate) ->addFormat($midBitrate) ->addFormat($highBitrate) ->save('adaptive_steve.m3u8');

As of version 1.2.0 the addFormat method of the HLS exporter takes an optional second parameter which can be a callback method. This allows you to add different filters per format:, (*22)

``` php $lowBitrate = (new X264)->setKiloBitrate(250); $highBitrate = (new X264)->setKiloBitrate(1000);, (*23)

FFMpeg::open('steve_howe.mp4') ->exportForHLS() ->addFormat($lowBitrate, function($media) { $media->addFilter(function ($filters) { $filters->resize(new \FFMpeg\Coordinate\Dimension(640, 480)); }); }) ->addFormat($highBitrate, function($media) { $media->addFilter(function ($filters) { $filters->resize(new \FFMpeg\Coordinate\Dimension(1280, 960)); }); }) ->save('adaptive_steve.m3u8');, (*24)


As of version 1.3.0 you can monitor the transcoding progress of a HLS export. Use the ```onProgress``` method to provide a callback which gives you the completed percentage. ``` php $exporter = FFMpeg::open('steve_howe.mp4') ->exportForHLS() ->onProgress(function ($percentage) { echo "$percentage % transcoded"; });

As of version 2.1.0 you can disable the sorting of the added formats as most players choose the first format as the default one., (*25)

``` php $exporter = FFMpeg::open('steve_howe.mp4') ->exportForHLS() ->dontSortFormats();, (*26)


## Advanced The Media object you get when you 'open' a file, actually holds the Media object that belongs to the [underlying driver](https://github.com/PHP-FFMpeg/PHP-FFMpeg). It handles dynamic method calls as you can see [here](https://github.com/mronx/laravel-ffmpeg/blob/master/src/Media.php#L114-L117). This way all methods of the underlying driver are still available to you. ```php // This gives you an instance of Mronx\LaravelFFMpeg\Media $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');

If you want direct access to the underlying object, call the object as a function (invoke):, (*27)

// This gives you an instance of Mronx\LaravelFFMpeg\Media
$media = FFMpeg::fromDisk('videos')->open('video.mp4');

// This gives you an instance of FFMpeg\Media\MediaTypeInterface
$baseMedia = $media();

Example app

Here's a blogpost that will help you get started with this package:, (*28)

https://pascalbaljetmedia.com/en/blog/how-to-use-ffmpeg-in-your-laravel-projects, (*29)

Changelog

Please see CHANGELOG for more information what has changed recently., (*30)

Testing

bash $ composer test, (*31)

Contributing

Please see CONTRIBUTING for details., (*32)

Security

If you discover any security related issues, please email pascal@pascalbaljetmedia.com instead of using the issue tracker., (*33)

Credits

License

The MIT License (MIT). Please see License File for more information., (*34)

The Versions