mronx / laravel-ffmpeg
Laravel 的 FFMpeg
Requires
- php: ^7.1
- illuminate/config: 5.6.*
- illuminate/filesystem: 5.6.*
- illuminate/log: 5.6.*
- league/flysystem: ~1.0
- mronx/php-ffmpeg: ~0.14.0
- symfony/process: ~4.0
Requires (Dev)
- mockery/mockery: ^1.0
- phpunit/phpunit: ^6.0|^7.0
README
本软件包为 Laravel 5.6 提供了 FFmpeg 的集成。文件的存储由 Laravel 的文件系统 处理。
特性
- PHP-FFMpeg(https://github.com/PHP-FFMpeg/PHP-FFMpeg)的超级简单包装器,包括对过滤器和其它高级特性的支持。
- 与 Laravel 的文件系统、配置系统 和 日志处理 集成。
- 兼容 Laravel 5.6。
- 支持 软件包发现。
- 仅支持 PHP 7.1 和 7.2。
安装
本软件包版本仅与 Laravel 5.6 兼容。如果您仍在使用 Laravel 5.1 - 5.5,请使用版本 1.3(该版本不再维护)。
您可以通过 composer 安装软件包
composer require mronx/laravel-ffmpeg
如果您不使用软件包发现,请将服务提供者和外观添加到您的 app.php 配置文件中。
// Laravel 5: config/app.php 'providers' => [ ... Mronx\LaravelFFMpeg\FFMpegServiceProvider::class, ... ]; 'aliases' => [ ... 'FFMpeg' => Mronx\LaravelFFMpeg\FFMpegFacade::class ... ];
使用 artisan CLI 工具发布配置文件
php artisan vendor:publish --provider="Mronx\LaravelFFMpeg\FFMpegServiceProvider"
用法
转换音频或视频文件
FFMpeg::fromDisk('songs') ->open('yesterday.mp3') ->export() ->toDisk('converted_songs') ->inFormat(new \FFMpeg\Format\Audio\Aac) ->save('yesterday.aac');
除了 fromDisk() 方法外,您还可以使用 fromFilesystem() 方法,其中 $filesystem 是 Illuminate\Contracts\Filesystem\Filesystem 的实例。
$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 开始,您可以通过使用 onProgress 方法提供一个回调,该回调提供完成百分比来监控 HLS 导出的转码进度。
$exporter = FFMpeg::open('steve_howe.mp4') ->exportForHLS() ->onProgress(function ($percentage) { echo "$percentage % transcoded"; });
从版本 2.1.0 开始,您可以禁用添加格式的排序,因为大多数播放器选择第一个格式作为默认格式。
$exporter = FFMpeg::open('steve_howe.mp4') ->exportForHLS() ->dontSortFormats();
高级
当您“打开”文件时获得的 Media 对象,实际上持有属于 底层驱动程序 的 Media 对象。它处理动态方法调用,如您在此处所见 这里。这样,底层驱动程序的所有方法仍然可供您使用。
// 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');
如果您想直接访问底层对象,请将对象作为函数(调用)
// 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();
示例应用
以下是一篇博客文章,将帮助您开始使用此软件包
https://pascalbaljetmedia.com/en/blog/how-to-use-ffmpeg-in-your-laravel-projects
更新日志
请参阅更新日志以获取有关最近更改的更多信息。
测试
$ composer test
贡献
请参阅贡献指南以获取详细信息。
安全性
如果您发现任何安全相关的问题,请发送电子邮件至pascal@pascalbaljetmedia.com,而不是使用问题跟踪器。
鸣谢
许可协议
MIT 许可协议 (MIT)。请参阅许可文件以获取更多信息。