mronx/laravel-ffmpeg

Laravel 的 FFMpeg

2.2.0 2018-06-11 00:13 UTC

README

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

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

特性

安装

本软件包版本仅与 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() 方法,其中 $filesystemIlluminate\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)。请参阅许可文件以获取更多信息。