finller/laravel-aws-mediaconvert

将AWS MediaConvert集成到Laravel

v1.0.1 2024-03-16 16:31 UTC

This package is auto-updated.

Last update: 2024-09-19 22:34:20 UTC


README

Latest Version on Packagist GitHub Tests Action Status GitHub Code Style Action Status Total Downloads

本包提供了一种与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优化的有用HLSMP4预设。以下是更高级的使用方法

将任何视频转换为优化的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控制器

在您的webapi或任何路由文件中,使用以下宏注册预构建的路由。您可以使用任何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规则

  1. 转到https://console.aws.amazon.com/cloudwatch/home(不要忘记为您的选择选择正确的区域)。
  2. 从左侧导航栏打开事件>规则。
  3. 点击创建规则。在事件源面板中选择“事件模式”单选按钮和“事件服务”(应该是默认值)。在“服务名称”中,选择“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)。有关更多信息,请参阅许可证文件