boz14676/laravel-ffmpeg

FFMpeg for Laravel

4.0.4 2019-04-24 14:39 UTC

README

Latest Version on Packagist Software License Build Status Quality Score Total Downloads

本包为Laravel 5.8提供了FFmpeg的集成。文件的存储由Laravel的文件系统处理。

特性

安装

只有此包的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()方法,其中$filesystemIlluminate\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)。有关更多信息,请参阅许可证文件