OCI Digital Media Services をクイックスタートしてみた

# OCI Digital Media Services 概要

**OCI Digital Media Services（OCI DMS）** は、2022年7月20日にリリースされたOracle Cloud Infrastructure（OCI）が提供する動画コンテンツの処理およびスケーラブルな配信を実現するためのフルマネージドサービスです。

OCI DMSは、**OCI Media Flow** と **OCI Media Streams** の2つのサービスで構成され、OCI Object StorageやOCI AI ServiceなどのOCIのサービスと連携して動作します。OCI DMSの全体像と、各サービスの概要は以下の通りです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/5f754d30-b2aa-c0a8-4b71-2e8a2a830abc.png)

## OCI Media Flow

OCI Media Flowは、動画コンテンツを処理するワークフローを構成するためのフルマネージドサービスです。この処理には、動画のトランスコード、サムネイル生成、A​​BRパッケージング、OCI AI Servicesとの統合を含みます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/d000dafe-05f7-110c-d557-d92d69d1ebd6.png)

- [OCI Media Flowサービス概要](https://www.oracle.com/cloud/media-flow/)
- [リリース・ノート - Media Flow service is now available](https://docs.oracle.com/en-us/iaas/releasenotes/changes/f97aede2-b2cb-4f4f-ac30-a532c5d69820/)
- [ドキュメント](https://docs.oracle.com/en-us/iaas/Content/dms-mediaflow/home.htm)

## OCI Media Streams

OCI Media Streams は、HLSなどの形式でパッケージングされた動画ファイルを視聴者に配信するフルマネージドサービスです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/a3afa103-629b-a6e4-1327-36a65197428f.png)

- [OCI Media Streamsサービス概要](https://www.oracle.com/cloud/media-streams/)
- [リリース・ノート - Media Streams service is now available](https://docs.oracle.com/en-us/iaas/releasenotes/changes/240031a8-3d3e-4de9-848e-8a9a59f40f80/)
- [ドキュメント](https://docs.oracle.com/en-us/iaas/Content/dms-mediastream/home.htm)


# 0. 準備

OCI DMSを使うため、以下の準備作業をします

+ OCI環境の取得
+ OCI DMSで利用する各種リソースやポリシーを設定するコンパートメントの作成

# 1. OCI Media Flowの構成

## 1.1 ポリシーの設定

OCI DMSのリソースを管理するコンパートメントに、以下2つのポリシーを設定します。今回はクイックスタートのため、ユーザーが所属するグループに対して全てのOCI DMSのサービス`media-family`を管理できる権限を付与します。さらに、変換前の動画ファイルはOCI Object Storageに登録する必要があるため、Object Storage`object-family`を管理できる権限も設定します

```
Allow group <グループ名> to manage media-family in compartment <コンパートメント名>
Allow group <グループ名> to manage object-family in compartment <コンパートメント名>
```

Media Flowのポリシー設定の詳細は、以下ドキュメントをご確認ください
- [Media Flow IAM Policies and Permissions](https://docs.oracle.com/en-us/iaas/Content/dms-mediaflow/med-flow-permissions_and_policies.htm)


## 1.2 Object Storage の準備

### 1.2.1 バケットの作成

Media Flowで利用する動画は、Object Storage の **バケット(Bucket)** で管理します。ここでは、変換前の動画を保管する入力バケット(InputBucket)と、変換後の動画を保管する出力バケット(OutputBucket)の2つを作成します

1. OCIコンソールにサインインします
1. 左上のメニューより **ストレージ** → **オブジェクト・ストレージとアーカイブ・ストレージ**を選択  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/311f9fc4-9ed2-5e48-d8b5-085730b5a743.png)

1. 事前に作成したコンパートメントを選択し、**バケットの作成** をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/c094d539-c689-4da1-789b-673874e3390f.png)

1. バケット名を入力し、**作成**をクリックします。ここでは `InputBucket` で作成します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/f8b03887-eef3-4615-bbe1-cc1cabbb61ad.png)

1. 同じ手順を繰り返し、出力バケットを作成します。ここでは `OutputBucket` で作成します
1. 作成後は2つのバケット `InputBucket`と`OutputBucket`が表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/54a8ae24-af82-bc19-13cb-1cb14630a5c8.png)

### 1.2.2 動画ファイルの登録

変換する前の動画ファイルを `InputBucket`に登録します。ここではmp4の動画ファイルを登録します

1. `InputBucket`をクリックします

1. オブジェクトの**アップロード**をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/67234797-4cfd-42b0-bb02-0ac0ac103dce.png)

1. **ファイルを選択**をクリックし、ローカル環境から任意のmp4形式の動画ファイルを選択し、**アップロード** をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/e40e0c14-435f-66e8-edc6-e359ff16dab7.png)

1. `InputBucket`に動画ファイルが登録されます。この動画を変換前の入力動画として使います
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/cfff45eb-aa82-9134-623e-5d5ec4983bf7.png)

## 1.3 メディアワークフローの作成

Media Flowで動画を変換する一連の処理を、**メディア・ワークフロー** として定義します。メディア・ワークフローは、OCI管理コンソール、API、CLI等から作成できます。今回はOCI管理コンソールより作成します

1. 左上のメニュー→**アナリティックスとAI**→**メディア・フロー**をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/27e77f2e-d0e2-c0e5-6f45-9006a5aec7f1.png)

1. 事前に作成したコンパートメントを選択し、**Create Media Workflow** をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/c2ae2a53-d1d2-f0c8-81eb-75d13dd3834f.png)

1. Create Media Workflowの画面が開きます。画面下部の **Configure Tasks for Media Workflow**より、ワークフロー内での一連の処理（タスク）を定義します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/892198bd-6aa7-4e74-e9a7-4156f07f16e2.png)

1. `Input`タスクで、変換前の動画ファイルを取り込むObject Storageのバケットを指定します。ここでは`InputBucket`を選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/2cad49ba-3957-6245-563c-42eebf110090.png)

1. `Transcode`タスクでトランスコード処理を定義します。今回は以下の通りに作成します（ほぼデフォルト設定のまま）
    - Transcode Type: **Standard**
    - Transcode Option
        - Package type: **HLS**
        - Segment length: **6**
        - Video codec: **H.264**
        - Audio codec: **AAC**
    - Ladder: （デフォルトのまま。1080p/720p/480p/360pの4つの画質が作成）
    - Task output: **Transcode/**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/354d94b9-a253-613a-729d-f67c156e2e4e.png)

1. `OCI AI Services` は無効（Disable）のままとします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/ff7e606b-b4ee-fcc4-2f21-0349026d50c9.png)

1. `Thumbnail`タスクで、サムネイル画像の作成処理を定義します。Task outputに **Thumbnail/** を入力し、その他はすべてデフォルト設定のままとします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/09486757-a989-fdff-ac44-ac2fb04487f2.png)

1. `Output`タスクで、変換後の動画ファイルを取り込むObject Storageのバケットを指定します。ここでは **OutputBucket** を選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/51e97822-592e-f31a-d007-be5dd8955812.png)

1. `Streaming`タスクは、無効（Disable）のままとします

1. **Save** をクリックします

1. メディア・ワークフローの名前を入力し、**Save**をクリックします（ここでは **Test Media Workflow** と設定）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/2b74066b-283e-dc37-41f4-643e2b78d59a.png)

1. メディア・ワークフローが作成されます。Statusが `Active` であることを確認します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/ec7441ea-69da-10d2-5e86-0c10e8bedc09.png)

## 1.4 メディアフロージョブの実行

作成したメディアワークフローを実行し、動画ファイルを変換します。なお、メディア・ワークフローの実行単位を **メディアフロージョブ（Job）** と言います

1. 前の手順で作成した **Test Media Workflow** を開き、**Run Job**をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/219ddce4-d598-68a1-d0a8-f35e74412a2d.png)

1. `Select file from Object Store`で、**InputBucket**が選択されていることを確認し、事前に登録した変換前の動画を選択します
1. 続けて、`Select save location`で、**OutputBucket**が選択されていることを確認します。`Job output prefix` を **output_1/** に変更します
1. 最後に **Run Job** をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/f9b0a113-bacf-492f-1d1d-a2091a28605c.png)

1. ジョブが開始されます。ジョブの実行時間は、システム全体の負荷、ユーザーが同時実行したジョブの数、動画ファイルの大きさやトランスコードのパターンにより異なります。しばらくすると、ジョブが完了します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/494bdace-07f2-a177-657e-d87ec2d13f1e.png)

1. 画面をスクロールすると、ワークフロー内のタスクの実行結果やトランスコード後のインデックスファイルや動画ファイル出力された内容`Job output`を確認できます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/e62bb996-2b80-9edc-289b-c83e59d768af.png)

1. `Job output` の **Bucket OutputBucket** のリンクをクリックすると、Object Storage のOutputBucket が開きます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/833f92d1-6147-4dbd-7737-66dca29e9f94.png)


# 2. OCI Media Streamsの構成

**OCI Media Streams** は、HLS（HTTP Live Streaming）の形式でパッケージ化された動画コンテンツを視聴者に配信するフルマネージドサービスです。

## 2.1 ポリシーの設定

OCI Media Streamsは、Media Flowで作成した各種リソースを利用します。そのために、以下2つのポリシーを、DMSの各リソースを管理するコンパートメントに設定します。

```
Allow service mediaservices to read object-family in compartment <コンパートメント名>
Allow service mediaservices to read media-family in compartment <コンパートメント名>
```

Media Streamsのポリシー設定の詳細は、以下ドキュメントをご確認ください
- [Media Streams IAM Policies and Permissions](https://docs.oracle.com/en-us/iaas/Content/dms-mediastream/media-streams_permissions_and_policies.htm)

## 2.2 Distribution Channel の作成

Distribution Channel（配信チャネル）は、ユーザーに動画をストリーミング配信するチャネルで、視聴者に対して動画を配信する論理的なエンドポイントとなります


1. 左上のメニュー→**アナリティックスとAI**→**メディア・ストリーム**をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/b28e5651-b9ed-8b87-7477-651a1079f7d4.png)

1. 事前に作成したコンパートメントを選択し、**Create Distribution Channel** をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/017952cd-5c4d-0043-f992-52719b0c3cc9.png)

1. `Name`を入力します（ここでは **Test Distribution Channel** と入力）。続けて、`CDN`で **OCI EDGE**を選択します。最後に **Create** をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/c91877da-8b03-c3f0-9cd1-08fc4301427a.png)

1. Distribution Channelが作成されます。Distribution Channelを作成すると、配信チャネル毎にユニークなドメイン名が割り当てられます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/d3b7d6c0-9d1e-acbd-2933-79e813caba21.png)


:::note info
Distribution Channel作成時、CDNで **OCI EDGE** を選択すると、OCIがエッジとなり、視聴者に対して動画コンテンツが配信されます。**AKAMAI** を選択すると、Akamaiがエッジ、OCIをオリジンとなり、視聴者に対して動画コンテンツが配信されます。なお、Akamaiは、お客様にてご準備いただく必要があります
:::


## 2.3 Packaging Configuration の作成

Distribution Channel内のパッケージング処理を構成します

1. 作成したDistribution Channelを開き、左下のリソースより、**Packaging Configurations**をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/4241ceaf-be96-7b54-385e-dfbaeb980274.png)

1. **Create Packaging Configuration** をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/faea02b3-f4e9-c1b3-e579-9819783e1c2f.png)

1. 以下の通りに入力し、**Create**をクリックします
    - Name: **Test Packaging Configuration**
    - Format: **HLS**
    - Segment size in seconds: **20**
    - Encryption algorithm: **NONE**
    - KMS Key Id: （未入力）
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/6b42292d-8647-592b-4984-fd8046e181c2.png)

1. **Test Distribution Channel** 内に **Test Packaging Configuration** が作成されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/b0c1320f-15f0-64bd-290d-91c812bb95e2.png)


## 2.4 Distribution ChannelにPlaylist Assetを取り込む

作成したDistribution Channelに配信する動画コンテンツ（HLS形式）を取り込みます。取り込む動画コンテンツは、Media Flowでトランスコードしたファイルを利用します

1. 作成した **Test Distribution Channel** を開き、左下のリソースの **Playlist Assets** をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/ce32cc2c-cf55-d336-fed3-cc2845e173e7.png)

1. **Ingest Playlist Asset** をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/73f59a37-477a-780b-195e-2c3e3e5e599e.png)

1. バケットで **OutputBucket** を選択します。続けて、`output_1 > Transcode`を開き、**master.m3u8** を選択します。最後に **Create** をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/fb80c533-7c3e-a78b-7c1a-0a2c7e16bf08.png)

1. 取り込み処理が開始されます。しばらくすると、Ingest Job Statusが **Succeeded** に変わると、取り込みが完了します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/630f7b8a-3868-950b-2c79-bf82b4c17647.png)


## 2.5 確認

取り込みが完了した動画コンテンツが正しくストリーミング配信できるか？を確認します。なお、動画の再生を確認するには、hls.jsなどのJavaScriptライブラリを利用したHLSクライアントの実装が必要です。今回は、以下のサイトを利用します

- https://hls-js.netlify.app/demo/

1. 前の手順で取り込んだ動画コンテンツ（`output_1/Transcode/master.m3u8`）を開きます

1. Preview URLの `Packaging` を選択します。ここでは、前の手順で作成した **Test Packaging Configuration** を選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/6adc5b53-3cb5-8402-e069-abb2310bf1e5.png)

1. Preview URLが生成されます。コピーをクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/42fa6492-dd8b-0018-7974-86bc39ab299d.png)

1. 別のブラウザで、https://hls-js.netlify.app/demo/ を開きます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/7bf7881c-2deb-faf2-77a0-459fd05a2012.png)

1. コピーしたURLを入力し、**Apply**をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/e762a172-466a-6989-6d7a-2f22d777324d.png)

1. 動画が再生されることを確認します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/f3a91821-fd28-7449-21c8-24f0fe0cd3b7.png)

1. 画面下部の Currently played level に、Media Flowのメディアワークフロー作成時の`Transcode`タスクの`Ladder`で指定した画質（360p/480p/720p/1080p）が選択できます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/94afb988-07f7-b0ea-2239-4bec1826531f.png)



# おわりに

以上で OCI Digital Media Services のクイックスタートは完了です。とても簡単に使い始めることができます。今回は最もシンプルな`Transocode Type`= **Standard** を選択しましたが、**Speed Optimized** や **Quality Optimized** なども選択可能です。

さらに、**OCI AI Services** との連携機能を有効化すると、動画内の音声の文字起こし（English、Portuguese、Spanishをサポート）、動画内のオブジェクト検出やテキスト検出（Englishのみサポート）、も可能となります。

お時間ありましたら、是非一度お試しいただければ幸いです