方法:アップロード(基本)

はじめに

統合の道のりを進めましょう。Frame.io へのアセットのアップロードについて確認します。このガイドでは、基本的なアップロードプロセスについて順を追って説明します。

前提条件

まだの場合は、C2C の実装:セットアップガイドを読んでから先へ進んでください。

認証および承認プロセス中に、access_token の取得が必要になります。

このガイドでは、この Frame.io リンクから入手できるサンプルテストアセットを使用します。このファイルをダウンロードし、例に従ってください。サンプルコマンドと同じ値を使用できます。

手順 1:アセットを作成する

サンプルファイルをアップロードしましょう。このファイルは 10 秒前に作成されたものとします。まず、Frame.io でアセット参照を作成する必要があります。

${
>curl -X POST https://api.frame.io/v2/devices/assets \
> --header 'Authorization: Bearer [access_token]' \
> --header 'Content-Type: application/json' \
> --header 'x-client-version: 2.0.0' \
> --data-binary @- <<'__JSON__'
> {
> "name": "C2C_TEST_CLIP.mp4",
> "filetype": "video/mp4",
> "filesize": 21136250,
> "offset": 10
> }
>__JSON__
>} | python -m json.tool
API エンドポイント仕様

/v2/devices/assets のドキュメントはこちらに用意されています。レガシーエンドポイント /v2/assets は引き続き機能しますが、新しい統合では /v2/devices/assets の使用をお勧めします。

JSON エンコーディング

以前使用していた認証エンドポイントとは異なり、このエンドポイントは form/multipart ではなく application/json エンコーディングを受け入れます。また、application/x-www-form-urlencoded も受け入れます。

コマンド構文

この例では、heredoc を使用して、JSON ペイロードを読みやすい複数行形式で curl に提供しています。--data-binary@- パラメーターは curl に対し、stdin から生データを読み取るよう指示しています。このアプローチの詳細については、こちらを参照してください。

JSON ペイロードパラメーターを確認しましょう。

name:Frame.io に表示されるアセット名。ディスク上のファイル名と一致している必要はありません。

filetype:ファイルの MIME タイプ。ほとんどのプログラミング言語には、MIME タイプ検出用のユーティリティが用意されています(例:GoPython)。

filesize:ファイルサイズ(バイト単位)。サンプルファイルは約 21.1 MB です。

offset:ファイルが作成されてからの秒数。省略した場合はデフォルトで 0 になります。デバイスの一時停止を理由にファイルを拒否するかどうかの判断に役立つことから、このパラメーターは必須です。詳細については、アップロード(高度)ガイドで説明しています。

レスポンスは次のようになります(一部のフィールドは省略されています)。

1{
2 "_type": "file",
3 ...
4 "id": "9a280f99-8f4f-46b0-a4b4-ec4c2f95138e",
5 ...
6 "upload_urls": [
7 "https://frameio-uploads-production.s3-accelerate.amazonaws.com/parts/[part_01_path]",
8 "https://frameio-uploads-production.s3-accelerate.amazonaws.com/parts/[part_02_path]"
9 ],
10 ...
11}

この段階では、ファイルをアップロードする意図を Frame.io に通知しているだけで、実際のファイルデータは転送されていません。プロジェクトでデバイスのフォルダーを確認すると、「アップロード中」状態のプレースホルダーアセットが表示されます。

upload_urls フィールドには、ファイルチャンクをアップロードする URL が含まれています。このテストファイルに対し、2 つのアップロード URL が返されます。

手順 2:ファイルをチャンクに分割する

レスポンスには複数のアップロード URL が含まれていました。Frame.io にアップロードする際にファイルをチャンクに分割して個別にアップロードすることには、次のようなメリットがあります。

  • 信頼性の向上:1 個のチャンクに障害が発生しても、アップロード全体をやり直す必要はありません。
  • アップロードの高速化:複数のチャンクを並行してアップロードできます(アップロード(高度)ガイドで説明しています)。

最適なチャンクサイズを決定するには、次の式を使用します。

Python
1# We use math.ceil() to ensure we get the upper bound in the division
2chunk_size = math.ceil(float(file.size) / float(len(response.upload_urls)))

このサンプルファイルの場合、計算は次のようになります。

Python
1math.ceil(21136250 / 2)
2# 10568125

つまり、各チャンクは 10,568,125 バイトである必要があります。チャンクサイズは通常、25 MB 前後を目指します。正確な計算についてはアップロード(高度)ガイドを参照してください。

最終チャンクサイズ

ファイルサイズが均等に分割されることはまれなので、最終チャンクは計算された chunk_size よりも小さくなる可能性があります。実装では、ファイルチャンクを読み取る際にこのことを考慮する必要があります。

このデモンストレーションでは、head および tail コマンドを使用して、ファイルチャンクを抽出します。

手順 3:チャンクをアップロードする

最初のチャンクをアップロードするには:

$head -c 10568125 ~/Downloads/C2C_TEST_CLIP.mp4 | \
>curl -X PUT https://frameio-uploads-production.s3-accelerate.amazonaws.com/parts/[part_01_path] \
> --include \
> --header 'content-type: video/mp4' \
> --header 'x-amz-acl: private' \
> --data-binary @-
コマンド構文

--data-binary@- パラメーターは curl に対し、head コマンドで取得した stdin からの生データを使用するよう指示します。

リクエストに次のヘッダーが必要です。

content-type:アセットの作成時に使用されたものと同じ MIME タイプ値

x-amz-acl:AWS S3 権限の場合は常に private に設定

アップロードが正常に完了すると、次が返されます。

HTTP/1.1 100 Continue
HTTP/1.1 200 OK
...

同様に、2 番目のチャンクをアップロードします。

$tail -c 10568125 ~/Downloads/C2C_TEST_CLIP.mp4 | \
>curl -X PUT https://frameio-uploads-production.s3-accelerate.amazonaws.com/parts/[part_02_path] \
> --include \
> --header 'content-type: video/mp4' \
> --header 'x-amz-acl: private' \
> --data-binary @-

両方のアップロードが完了すると、アセットは Frame.io で再生可能になります。🎉

アップロードエラー

チャンクのアップロードでは、データが Frame.io の API にではなく AWS S3 に直接送信されます。エラーレスポンスは、標準の Frame.io エラーではなく、AWS S3 形式に従います。S3 エラーの処理については、エラー処理ガイドで説明します。

チャンク順序

概念的にはチャンクを順番にアップロードするほうがシンプルですが、実際には任意の順序でアップロードできます。システムは、アップロード順に関係なく、正しく再構成します。

まとめ

アップロードプロセス全体を示す簡素化された Python 風擬似コードの例を次に示します。

Python
1file = open("~/Downloads/C2C_TEST_CLIP.mp4")
2mimetype = mimetypes.for_file("~/Downloads/C2C_TEST_CLIP.mp4")[0]
3created_at = time.ctime(file.stat.ST_CTIME)
4
5asset = c2c.asset_create(
6 name="C2C_TEST_CLIP.mp4",
7 filetype=mimetype,
8 filesize=file.size,
9 offset=datetime.now() - created_at,
10 channel=0,
11)
12
13chunk_size = math.ceil(float(file.size) / float(len(asset.upload_urls)))
14
15for chunk_url in asset.upload_urls:
16 chunk = file.read(bytes=chunk_size)
17 c2c.upload_chunk(chunk, chunk_url, mimetype)

この例は基本フローであり、エラー処理や並列アップロードはありません。これらについては、エラー処理アップロード(高度)のガイドで説明します。

次のステップ

最初のアセットが Frame.io に正常にアップロードされました。アップロード(高度)ガイドでは、本番対応の実装に向けたより高度な技術と要件について説明します。

不明点がありましたら、当社チームまでお問い合わせください。また、アップロード(リアルタイム)ガイドに進んで、アセットの作成時のアップロードについてご確認ください。