boz14676 / laravel-ffmpeg
FFMpeg for Laravel
Requires
- php: ^7.1.3
- boz14676/php-ffmpeg: ^0.14.0
- illuminate/config: 5.8.*
- illuminate/filesystem: 5.8.*
- illuminate/log: 5.8.*
- illuminate/support: 5.8.*
- league/flysystem: ~1.0
- symfony/process: ~4.0
Requires (Dev)
- mockery/mockery: ^1.0
- phpunit/phpunit: 7.5
This package is auto-updated.
Last update: 2024-09-25 07:44:36 UTC
README
本包为Laravel 5.8提供了FFmpeg的集成。文件的存储由Laravel的文件系统处理。
特性
- 围绕PHP-FFMpeg的超简单包装,包括对过滤器和其他高级特性的支持。
- 与Laravel的文件系统、配置系统和日志处理集成。
- 兼容Laravel 5.8。
- 支持包发现。
- 仅支持PHP 7.1、7.2和7.3。
安装
只有此包的master分支和4.0版本与Laravel 5.8兼容。如果您仍在使用较旧版本的Laravel,请参考下表了解应使用哪个版本。请注意,旧版本不再受支持。
您可以通过Composer安装此包
composer require pbmedia/laravel-ffmpeg
如果您不使用包发现,请将服务提供者和外观添加到您的app.php
配置文件中。
// Laravel 5: config/app.php 'providers' => [ ... Pbmedia\LaravelFFMpeg\FFMpegServiceProvider::class, ... ]; 'aliases' => [ ... 'FFMpeg' => Pbmedia\LaravelFFMpeg\FFMpegFacade::class ... ];
使用artisan CLI工具发布配置文件
php artisan vendor:publish --provider="Pbmedia\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"; });
从版本2.1.0开始,您可以禁用添加格式的排序,因为大多数播放器都将第一个格式作为默认格式。
$exporter = FFMpeg::open('steve_howe.mp4') ->exportForHLS() ->dontSortFormats();
高级
您在打开文件时获得的Media对象实际上是属于底层驱动的Media对象。它处理动态方法调用,如此处所示。这样,底层驱动程序的所有方法仍然可用。
// This gives you an instance of Pbmedia\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 Pbmedia\LaravelFFMpeg\Media $media = FFMpeg::fromDisk('videos')->open('video.mp4'); // This gives you an instance of FFMpeg\Media\MediaTypeInterface $baseMedia = $media();
示例应用
以下博客文章将帮助您开始使用此包
https://protone.media/en/blog/how-to-use-ffmpeg-in-your-laravel-projects
Wiki
更新日志
有关最近更改的更多信息,请参阅更新日志。
测试
$ composer test
贡献
有关详细信息,请参阅贡献指南。
安全
如果您发现任何与安全相关的问题,请通过电子邮件pascal@pascalbaljetmedia.com联系,而不是使用问题跟踪器。请不要通过电子邮件提出任何问题,如果您有问题,请开启一个问题。
致谢
许可证
MIT许可证(MIT)。有关更多信息,请参阅许可证文件。