sormagec / laravel-ffmpeg
用于Laravel的FFMpeg
Requires
- php: ^7.1
- illuminate/config: 5.5.*
- illuminate/filesystem: 5.5.*
- illuminate/log: 5.5.*
- league/flysystem: ~1.0
- sormagec/php-ffmpeg: ~0.15.0
- symfony/process: ^4.0|^3.0
Requires (Dev)
- mockery/mockery: ^1.0
- phpunit/phpunit: ^6.0|^7.0
README
本软件包为Laravel 5.6提供FFmpeg的集成。文件存储由Laravel的文件系统处理。
功能
- 围绕PHP-FFMpeg的超级简单包装,包括对过滤器和其他高级功能的支持。
- 与Laravel的文件系统、配置系统和日志处理集成。
- 兼容Laravel 5.6。
- 支持包发现。
- 仅支持PHP 7.1和7.2。
安装
本软件包版本仅与Laravel 5.6兼容。如果您仍在使用Laravel 5.1 - 5.5,请使用版本1.3(该版本不再维护)。
您可以通过composer安装此软件包
composer require pbmedia/laravel-ffmpeg
如果您不使用包发现,请将服务提供者和外观添加到您的app.php配置文件中。
// Laravel 5: config/app.php 'providers' => [ ... Sormagec\LaravelFFMpeg\FFMpegServiceProvider::class, ... ]; 'aliases' => [ ... 'FFMpeg' => Sormagec\LaravelFFMpeg\FFMpegFacade::class ... ];
使用artisan CLI工具发布配置文件
php artisan vendor:publish --provider="Sormagec\LaravelFFMpeg\FFMpegServiceProvider"
使用方法
转换音频或视频文件
FFMpeg::fromDisk('songs') ->open('yesterday.mp3') ->export() ->toDisk('converted_songs') ->inFormat(new \FFMpeg\Format\Audio\Aac) ->save('yesterday.aac');
您也可以使用fromFilesystem()方法,其中$filesystem是Illuminate\Contracts\Filesystem\Filesystem的实例,而不是fromDisk()方法。
$media = FFMpeg::fromFilesystem($filesystem)->open('yesterday.mp3');
您可以通过闭包或使用PHP-FFMpeg的Filter对象添加过滤器
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');
有时您可能不想使用内置的过滤器。您可以通过提供一系列选项来应用自己的过滤器。这可以是数组或多个字符串参数
FFMpeg::fromDisk('videos') ->open('steve_howe.mp4') ->addFilter(['-itsoffset', 1]); // or FFMpeg::fromDisk('videos') ->open('steve_howe.mp4') ->addFilter('-itsoffset', 1);
链式多个转换
// 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')
从视频中创建一个帧
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 FMpeg\Coordinate\TimeCode(...); $frame = $media->getFrameFromTimecode($timecode);
使用Media类,您可以确定文件的持续时间
$media = FFMpeg::open('wwdc_2006.mp4'); $durationInSeconds = $media->getDurationInSeconds(); // returns an int $durationInMiliseconds = $media->getDurationInMiliseconds(); // returns a float
当从或向远程磁盘打开或保存文件时,您的服务器上会创建临时文件。在您完成导出或处理这些文件后,您可以通过调用cleanupTemporaryFiles()方法来清理它们
FFMpeg::cleanupTemporaryFiles();
HLS
您可以使用M3U8播放列表来创建HLS。目前仅支持在本地磁盘上导出。
$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');
从版本1.2.0开始,HLS导出器的addFormat方法接受一个可选的第二个参数,该参数可以是回调方法。这允许您为每种格式添加不同的过滤器
$lowBitrate = (new X264)->setKiloBitrate(250); $highBitrate = (new X264)->setKiloBitrate(1000); 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');
从版本1.3.0开始,您可以监视HLS导出的转码进度。使用onProgress方法提供一个回调,该回调将提供完成百分比。
$exporter = FFMpeg::open('steve_howe.mp4') ->exportForHLS() ->onProgress(function ($percentage) { echo "$percentage % transcoded"; });
高级
当您打开文件时获得的Media对象实际上持有属于底层驱动的Media对象。它处理动态方法调用,如此处所示。这样,所有底层驱动的方法仍然可用。
// This gives you an instance of Sormagec\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');
如果您想直接访问底层对象,请将对象作为函数(调用)
// This gives you an instance of Sormagec\LaravelFFMpeg\Media $media = FFMpeg::fromDisk('videos')->open('video.mp4'); // This gives you an instance of FFMpeg\Media\MediaTypeInterface $baseMedia = $media();
示例应用
以下是一篇博客文章,可以帮助您开始使用本软件包
https://pascalbaljetmedia.com/en/blog/how-to-use-ffmpeg-in-your-laravel-projects
变更日志
请参阅变更日志获取更多关于最近变更的信息。
测试
$ composer test
贡献
请参阅贡献指南以获取详细信息。
安全性
如果您发现任何安全相关的问题,请通过电子邮件pascal@pascalbaljetmedia.com联系,而不是使用问题跟踪器。
致谢
许可协议
MIT许可协议(MIT)。请参阅许可文件以获取更多信息。