finller / laravel-aws-mediaconvert
将AWS MediaConvert集成到Laravel
Requires
- php: ^8.1
- aws/aws-php-sns-message-validator: ^1.8
- aws/aws-sdk-php: ^3.258.7
- illuminate/contracts: ^10.0|^11.0
- spatie/laravel-package-tools: ^1.14.1
Requires (Dev)
- laravel/pint: ^1.0
- nunomaduro/collision: ^7.8|^8.1
- nunomaduro/larastan: ^2.0.1
- orchestra/testbench: ^8.8|^9.0
- pestphp/pest: ^2.0
- pestphp/pest-plugin-laravel: ^2.0
- phpstan/extension-installer: ^1.1
- phpstan/phpstan-deprecation-rules: ^1.0
- phpstan/phpstan-phpunit: ^1.0
- phpunit/phpunit: ^10.0
- spatie/laravel-ray: ^1.26
README
本包提供了一种与AWS MediaConvert交互的简便方法。它为HLS、MP4优化和缩略图提供了有用的预设。
本包受到了meemalabs及其类似包https://github.com/meemalabs/laravel-media-converter的极大启发!
安装
您可以通过composer安装此包
composer require finller/laravel-aws-mediaconvert
您可以使用以下命令发布配置文件
php artisan vendor:publish --tag="laravel-aws-mediaconvert-config"
这是发布配置文件的内容
return [ /** * IAM Credentials from AWS. * * Please note, if you are intending to use Laravel Vapor, rename * From: AWS_ACCESS_KEY_ID - To: e.g. VAPOR_ACCESS_KEY_ID * From: AWS_SECRET_ACCESS_KEY - To: e.g. VAPOR_SECRET_ACCESS_KEY * and ensure that your Vapor environment has these values defined. */ 'credentials' => [ 'key' => env('AWS_ACCESS_KEY_ID'), 'secret' => env('AWS_SECRET_ACCESS_KEY'), ], 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), 'version' => 'latest', 'url' => env('AWS_MEDIACONVERT_ACCOUNT_URL'), /** * Specify the IAM Role ARN. * * You can find the Role ARN visiting the following URL: * https://console.aws.amazon.com/iam/home?region=us-east-1#/roles * Please note to adjust the "region" in the URL above. * Tip: in case you need to create a new Role, you may name it `MediaConvert_Default_Role` * by making use of this name, AWS MediaConvert will default to using this IAM Role. */ 'iam_arn' => env('AWS_IAM_ARN'), /** * Specify the queue you would like use. * * It can be found by visiting the following URL: * https://us-east-1.console.aws.amazon.com/mediaconvert/home?region=us-east-1#/queues/details/Default * Please note to adjust the "region" in the URL above. */ 'queue_arn' => env('AWS_QUEUE_ARN'), /** * Specify how often MediaConvert sends STATUS_UPDATE events to Amazon CloudWatch Events. * Set the interval, in seconds, between status updates. * * MediaConvert sends an update at this interval from the time the service begins processing * your job to the time it completes the transcode or encounters an error. * * Accepted values: 10, 12, 15, 20, 30, 60, 120, 180, 240, 300, 360, 420, 480, 540, 600 */ 'webhook_interval' => 60, ];
使用方法
以最基本的方式,此包提供了一个封装aws sdk的服务。因此,您可以通过调用createJob
来简单地创建MediaConvert作业。
Finller\AwsMediaConvert\Facades\AwsMediaConvert::createJob(settings: []);
但我们也提供了针对Web优化的有用HLS
和MP4
预设。以下是更高级的使用方法
将任何视频转换为优化的MP4
$input = AwsMediaConvert::getUri($path); // you can use getUri to build the S3 uri quickly AwsMediaConvert::createJob( settings: DefaultMediaConvertSettings::make($input) ->addOutputGroup( DefaultOptimizedVideoMediaConvertGroup::make( Destination: $destination, Height: min(1080, $originalHeight) // optional but you can set a Height or Width to resize the video ) ) ->toArray(), metaData: [ // feel free to add metadata so you can do the right action when receiving the webhook 'env' => config('app.env'), get_class($this->media) => $this->media->id, 'job' => get_class($this), ] );
将任何视频转换为优化的Apple HLS文件集
$input = AwsMediaConvert::getUri($path); // you can use getUri to build the S3 uri easily AwsMediaConvert::createJob( settings: DefaultMediaConvertSettings::make($input) ->addOutputGroup( DefaultHlsMediaConvertGroup::make($destination) ->addOutputWhen($maxHeight >= 1080, DefaultHls1080pMediaConvertOutput::make()) ->addOutputWhen($maxHeight >= 720, DefaultHls720pMediaConvertOutput::make()) ->addOutputWhen($maxHeight >= 540, DefaultHls540pMediaConvertOutput::make()) ->addOutputWhen($maxHeight >= 540, DefaultHls480pMediaConvertOutput::make()) ) ->toArray(), metaData: [] );
在一个作业中执行多个转换
$input = AwsMediaConvert::getUri($path); // you can use getUri to build the S3 uri easily AwsMediaConvert::createJob( settings: DefaultMediaConvertSettings::make($input) ->addOutputGroup( DefaultOptimizedVideoMediaConvertGroup::make( Destination: $destination, Height: min(1080, $originalHeight) // optional but you can set a Height or Width to resize the video ) ) ->addOutputGroup( DefaultHlsMediaConvertGroup::make($destination) ->addOutputWhen($originalHeight >= 1080, DefaultHls1080pMediaConvertOutput::make()) ->addOutputWhen($originalHeight >= 720, DefaultHls720pMediaConvertOutput::make()) ->addOutputWhen($originalHeight >= 540, DefaultHls540pMediaConvertOutput::make()) ->addOutputWhen($originalHeight >= 540, DefaultHls480pMediaConvertOutput::make()) ) ->toArray(), metaData: [] );
通过webhooks跟踪MediaConvert作业
1. 在您的应用程序中注册webhook路由。
您可以直接使用我们预构建的Webhook控制器
在您的web
、api
或任何路由文件中,使用以下宏注册预构建的路由。您可以使用任何url
Route::awsMediaConvertWebhook('aws/webhooks/media-convert');
如果您已将路由放在附加了VerifyCsrfToken
的地方,您将需要添加一个异常,就像这样
class VerifyCsrfToken extends Middleware { /** * The URIs that should be excluded from CSRF verification. * * @var array<int, string> */ protected $except = [ 'aws/*', // Put the route you have chosen here ]; }
2. 创建一个SNS主题
转到https://console.aws.amazon.com/sns/v3/home(不要忘记为您的选择选择正确的区域)。
在右侧导航栏中选择“主题”,然后点击右侧的“创建主题”按钮。对于类型,选择“标准”,并为您的主题命名,例如“MediaConvertJobUpdate”,然后点击“创建主题”。
现在,点击“创建订阅”,选择“HTTPS”作为协议,然后输入您选择的webhook路由,例如https://app.example/aws/webhooks/media-convert
,然后确认创建。
默认情况下,AWS将向您在“订阅”设置中定义的URL发送POST请求。此包自动处理“确认”部分。如果存在问题且尚未确认,请点击“请求确认”按钮。
3. 创建一个AWS CloudWatch规则
- 转到https://console.aws.amazon.com/cloudwatch/home(不要忘记为您的选择选择正确的区域)。
- 从左侧导航栏打开事件>规则。
- 点击创建规则。在事件源面板中选择“事件模式”单选按钮和“事件服务”(应该是默认值)。在“服务名称”中,选择“MediaConvert”,并将事件类型保留为“所有事件”。
您的事件模式预览应该是
{ "source": [ "aws.mediaconvert" ] }
如果您需要监听特定的队列,例如,可以这样做
{ "source": ["aws.mediaconvert"], "detail": { "queue": ["arn:aws:mediaconvert:us-east-1:123456789:queues/Default"] } }
在目标面板(右侧)中,点击“添加目标”,然后选择“SNS主题”。然后选择之前创建的SNS主题。
这就完了,这个包将为你分发Laravel事件。但如果你需要更具体的行为,你可以通过扩展AwsMediaConvertWebhookController
等来创建自己的控制器。
测试
composer test
变更日志
有关最近更改的更多信息,请参阅变更日志。
贡献
有关详细信息,请参阅贡献指南。
安全漏洞
有关如何报告安全漏洞,请查看我们的安全策略。
鸣谢
许可证
MIT许可证(MIT)。有关更多信息,请参阅许可证文件。