[Herokuアドオン]TransloaditでAWS S3にアップロード

アップロードした動画をS3にエクスポートしてみた。

AWS

バケットを作る

まずはawsにてバケットを作る。

movie-upload-sampleで作った。
(アンダースコアを入れると怒られた)

アクセスキーとシークレットキー

s3uploadで、作成した。

作成後、アクセスキーとシークレットキーを確認できる。
CSVでもダウンロード化。

ただし、シークレットアクセスキーを確認できるのはこの状態が最後らしく、そのまま閉じようとしたら警告された。

確かに作成したユーザー情報を見ても確認は出来なかった。
忘れてしまったりした場合は再度アクセスキーの作成が必要なよう。
(セキュリティ的にはある程度の頻度で変更することがオススメされている)

次に権限を付与。
作成したユーザーをクリックして、アクセス許可 –> ポリシーのアタッチ、をクリック。

AmazonS3FullAccessを選択して、ポリシーのアタッチ。

アタッチされた。

これでS3にアップロードする準備が整った。

Transloaditテンプレート

作成したバケットやIAMの情報をテンプレートに埋め込んでいく。
その時、アップするpathを選択できる。

path

ドキュメントを見ていると、以下のようにするのが推奨?されていた。
${previous_step.name}/${unique_prefix}/${file.id}.${file.ext}
出力例:video-step-name/a8/d3eeeb67479f11f8b091b04f6181ad.png

とりあえずこのままアップロードしてみた。
アップロードしたテンプレートは以下。

'params' => [
    'steps' => [
        'encode_video' => [
            'use' => ':original',
            'robot' => '/video/encode',
            'preset' => 'android'
        ],
        'thumb' => [
            'user' => 'encode_video',
            'robot' => '/video/thumbs',
            'count' => 1,
            'offsets' => [1],
            'width'=> 100,
            'height'=> 100,
        ],
        'export' => [
            'use' => ['encode_video', 'thumb'],
            'robot' => '/s3/store',
            'bucket' => 'movie-upload-sample',
            'key' => 'アクセスキー',
            'secret' => 'シークレットキー',
            'path' => '${previous_step.name}/${unique_prefix}/${file.id}.${file.ext}'
        ]
    ],
    'redirect_url' => $redirectUrl,
]

awsを見ると以下のようにアップロードされていた。

動画

サムネイル

ユニーク、なのだが、${unique_prefix}が戻り値にも含まれておらず、アップロード側から知ることが出来ないっぽい。
file.idは、UUIDになっているとのことなのでユニークなよう。
これを利用して以下のようにする。

${previous_step.name}/${file.id}.${file.ext}

これで以下の様なURLで参照出来るようになる。

https://{bucket}.s3.amazonaws.com/movie-upload-sample/encode_video/{id}.mp4
https://{bucket}.s3.amazonaws.com/movie-upload-sample/thumb/{id}.jpg

ちなみに、エクスポートを使用した場合は、
transloaditの管理画面から処理済のファイルへのアクセスも、指定したS3へのファイルが参照されるようになるよう。
(S3だけでなく、FTPなどでも同様)

全コード

<?php

require 'vendor/autoload.php';

use transloadit\Transloadit;
$transloadit = new Transloadit([
    'key' => getenv('TRANSLOADIT_AUTH_KEY'),
    'secret' => getenv('TRANSLOADIT_SECRET_KEY')
]);

$response = Transloadit::response();
if ($response) {
    echo '<h1>Assembly status:</h1>';
    echo '<pre>';
    print_r($response);
    echo '</pre>';
    exit;
}

$redirectUrl = sprintf(
    'http://%s%s',
    $_SERVER['HTTP_HOST'],
    $_SERVER['REQUEST_URI']
);

echo $transloadit->createAssemblyForm([
    'params' => [
        'steps' => [
            'encode_video' => [
                'use' => ':original',
                'robot' => '/video/encode',
                'preset' => 'android'
            ],
            'thumb' => [
                'user' => 'encode_video',
                'robot' => '/video/thumbs',
                'count' => 1,
                'offsets' => [1],
                'width'=> 100,
                'height'=> 100,
            ],
            'export' => [
                'use' => ['encode_video', 'thumb'],
                'robot' => '/s3/store',
                'bucket' => 'movie-upload-sample',
                'key' => 'アクセスキー',
                'secret' => 'シークレットキー',
                'path' => '${previous_step.name}/${file.id}.${file.ext}'
            ]
        ],
        'redirect_url' => $redirectUrl
    ]
]);
?>

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="utf-8">
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css">
</head>
<body>
<div class="container">
    <h1>Pick a video to encode for iPhone / Android.</h1>
    <form>
        <div class="form-group">
            <label for="exampleInputFile">File input</label>
            <input name="example_upload" id="exampleInputFile" type="file">
            <p class="help-block">Upload video, NOW.</p>
        </div>
        <input type="submit" class="btn btn-danger btn-lg" value="Upload">
    </form>
</div>

</body>
</html>

余談

ちなみに、transloaditのエンコードタイプには、プリセットでiPhoneとアンドロイドどちらも用意されているけれど、
今回試してみたところではどちらも同じ内容のようだった。
ffmpegで読み込ませてみた内容は以下。
(videoとaudioだけ抽出)

Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p, 480x320, 523 kb/s, 25 fps, 25 tbr, 25 tbn, 50 tbc (default)
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, mono, fltp, 82 kb/s (default)

参考

Encode a video for the iPhone and strip sound | Transloadit
Encode a video for Android | Transloadit
Encode a video, extract 8 thumbnails and store everything in your S3 bucket | Transloadit
awsのs3を操作する為のaccess keyとsecret keyを取得する(IAM)
Export to Amazon S3 with the /s3/store bot | Transloadit
#Assembly variables | Integration | Transloadit

   このエントリーをはてなブックマークに追加