[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