Skip to content

課題24: 動画エンコーディングパイプライン構築

難易度: 🟡 中級


1. 分類情報

項目内容
難易度中級
カテゴリバッチ処理 / メディア / コンテンツ配信
処理タイプバッチ / イベント駆動
使用IaCCloudFormation
所要時間5〜6時間

シナリオ

企業プロフィール

〇〇株式会社は、オリジナルドラマ・映画を配信するサブスクリプション型動画配信サービスを運営しています。

項目内容
業種動画配信(OTT)
設立2019年
従業員数80名
月間アクティブユーザー50万人
有料会員数30万人
月商3億円
コンテンツ数2,000本
月間新規コンテンツ500本
対応デバイスWeb、iOS、Android、Smart TV、Fire TV

現状の課題

コンテンツ制作会社から納品されるマスター動画(4K ProRes形式)を、各デバイス向けに手動でエンコードしています。エンコード作業がボトルネックとなり、コンテンツの配信開始が遅延しています。

数値で示された問題

指標現状目標
月間エンコード動画数500本変わらず
1本あたりエンコード時間4時間30分以内
エンコード担当者2名専任0名(自動化)
配信開始リードタイム48時間4時間以内
エンコードエラー率5%1%以下
出力フォーマット数8種類12種類以上

現状のエンコードワークフロー

1. 制作会社からマスター動画をHDD/クラウドで受領
2. 担当者がローカルPCにダウンロード(30分〜1時間)
3. Adobe Media Encoderで各フォーマットにエンコード(2〜3時間)
4. 目視で品質チェック(30分)
5. CDNにアップロード(30分)
6. メタデータ登録
→ 合計: 4〜5時間/本

必要な出力フォーマット

プロファイル解像度ビットレート対象デバイス
4K UHD3840×216015Mbps4K TV
1080p High1920×10808MbpsSmart TV, PC
1080p1920×10805MbpsPC, Tablet
720p1280×7203MbpsMobile WiFi
480p854×4801.5MbpsMobile 4G
360p640×3600.8MbpsMobile 3G
Audio Only-128kbpsバックグラウンド再生
  • HLS/DASH 両対応

解決したいこと

  1. マスター動画アップロード後の自動エンコード
  2. 複数フォーマットへの並列エンコード
  3. 配信開始リードタイムの大幅短縮
  4. エンコード品質の一貫性確保
  5. 自動品質チェック・エラー通知

成功指標(KPI)

KPI現状目標達成期限
エンコード時間/本4時間30分以内1ヶ月後
配信リードタイム48時間4時間以内1ヶ月後
自動化率0%95%以上2ヶ月後
エンコードエラー率5%1%以下1ヶ月後
人的工数160時間/月10時間/月2ヶ月後

達成目標

この演習で習得できるスキル:

技術的な学習ポイント

  1. AWS Elemental MediaConvertの実践活用

    • ジョブテンプレートの設計
    • 出力グループ(HLS, DASH)の設定
    • カスタムプリセット作成
  2. AWS Batchによる大規模バッチ処理

    • コンピューティング環境の設計
    • ジョブ定義とジョブキュー
    • スポットインスタンス活用
  3. S3イベント駆動アーキテクチャ

    • S3 → Lambda → MediaConvert
    • Step Functionsによるワークフロー
  4. CloudFrontによるコンテンツ配信

    • HLS/DASH配信設定
    • キャッシュ戦略

実務で活かせる知識

  • 動画配信プラットフォームの構築
  • メディア処理パイプラインの設計
  • コスト最適化(スポットインスタンス)

使用するAWSサービス

メインサービス

サービス役割選定理由
AWS Elemental MediaConvert動画エンコード高品質、多フォーマット対応
AWS Batch大規模並列処理(前処理用)スポット対応、コスト効率
Amazon S3入力/出力ストレージ大容量、イベント通知
AWS Lambdaオーケストレーションイベント駆動
AWS Step Functionsワークフロー管理可視化、エラー処理
Amazon CloudFrontコンテンツ配信グローバル配信

補助サービス

サービス役割
Amazon DynamoDBジョブ状態管理
Amazon SNS完了/エラー通知
Amazon CloudWatch監視・ログ
AWS Secrets ManagerAPIキー管理

前提条件

必要な事前知識

  • AWSの基本操作(S3, Lambda)
  • 動画フォーマットの基本(コーデック、コンテナ)
  • HLS/DASHの基本概念

準備するもの

  1. AWSアカウント

    • MediaConvertへのアクセス権限
    • 適切なIAM権限
  2. 開発環境

    • AWS CLI v2
    • Python 3.9以上
  3. テストデータ

    • サンプル動画ファイル(MP4, 1分程度)

アーキテクチャ概要

システム全体構成

コンポーネント役割
Producer制作会社(マスター動画をアップロード)
S3 Input入力バケット(マスター動画保存)
Lambda TriggerS3イベントでワークフロー起動
Step Functionsエンコードワークフロー管理
MediaConvert動画エンコード(HLS・DASH形式)
Lambda Thumbnailサムネイル画像生成
Lambda Metadataメタデータ更新処理
S3 Output出力バケット(エンコード済み動画)
CloudFrontCDNによるグローバル配信
Viewer動画視聴者
DynamoDBジョブ状態管理
SNS完了・エラー通知

エンコードフロー

  1. アップロード: 制作会社がS3にマスター動画をアップロード
  2. トリガー: S3イベントでLambdaが起動
  3. ワークフロー: Step Functionsで処理開始
  4. エンコード: MediaConvertで複数フォーマットに変換
  5. 後処理: サムネイル生成、メタデータ登録
  6. 通知: 完了通知を送信
  7. 配信: CloudFront経由で配信開始

トラブルシューティング課題

問題1: MediaConvertジョブがエラー終了

症状:

MediaConvert job status: ERROR
"Unable to open input file"

ヒント:

  1. 入力ファイルのS3パスが正しいか確認
  2. MediaConvertロールのS3権限を確認
  3. 入力ファイルが破損していないか確認

解決方法:

bash
# IAMロールのポリシー確認
aws iam list-attached-role-policies --role-name video-appMediaConvertRole

# S3アクセステスト
aws s3 ls s3://video-app-master-${ACCOUNT_ID}/uploads/

# MediaConvert用の追加ポリシー
aws iam attach-role-policy \
  --role-name video-appMediaConvertRole \
  --policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess

問題2: HLSマニフェストが正しく生成されない

症状:

index.m3u8が存在しない
プレイヤーで再生できない

ヒント:

  1. OutputGroupSettingsのDestinationを確認
  2. HlsGroupSettingsの設定を確認
  3. 出力ファイル一覧を確認

解決方法:

python
# 正しいHLS設定
"HlsGroupSettings": {
    "SegmentLength": 6,
    "MinSegmentLength": 0,
    "Destination": f"s3://{OUTPUT_BUCKET}/hls/{content_id}/",
    "ManifestCompression": "NONE",
    "DirectoryStructure": "SINGLE_DIRECTORY",
    "OutputSelection": "MANIFESTS_AND_SEGMENTS"  # これを追加
}

問題3: CloudFrontでCORSエラー

症状:

Access-Control-Allow-Origin エラー
動画プレイヤーで再生できない

ヒント:

  1. S3のCORS設定を確認
  2. CloudFrontのResponse Headers Policyを確認
  3. ブラウザのキャッシュをクリア

解決方法:

bash
# CloudFront Response Headers Policy設定
# コンソールから:
# 1. CloudFront → ディストリビューション → Behaviors
# 2. Response headers policy: SimpleCORS または カスタムポリシー
# 3. Access-Control-Allow-Origin: *
# 4. Access-Control-Allow-Methods: GET, HEAD, OPTIONS

設計の考察ポイント

1. MediaConvert vs 自前エンコード(FFmpeg)

考察ポイント:

  • MediaConvert: マネージド、スケーラブル、品質保証
  • FFmpeg on EC2/ECS: 柔軟性、カスタマイズ性
  • コスト比較(長時間動画の場合)

2. 出力フォーマットの選定

考察ポイント:

  • HLS vs DASH(デバイスカバレッジ)
  • ビットレートラダーの設計
  • ABR(Adaptive Bitrate)の最適化

3. 並列処理のアプローチ

考察ポイント:

  • MediaConvert単独 vs AWS Batch併用
  • チャンク分割エンコード
  • コスト効率とスループットのバランス

4. CDN配信の最適化

考察ポイント:

  • CloudFrontのキャッシュ戦略
  • セグメントサイズと初回再生時間
  • リージョン配置(エッジロケーション)

5. DRMとセキュリティ

考察ポイント:

  • 有料コンテンツの保護
  • Widevine / FairPlay対応
  • 署名付きURL / Cookie

発展課題(オプション)

1. DRM対応(SPEKE)

  • AWS Elemental MediaPackage連携
  • Widevine / FairPlay / PlayReady
  • ライセンスサーバー統合

2. ライブ配信対応

  • MediaLive + MediaPackage
  • ライブ to VODワークフロー
  • 低遅延配信(LL-HLS)

3. コンテンツモデレーション

  • Rekognition Video連携
  • 不適切コンテンツの自動検出
  • 年齢制限の自動判定

4. 字幕・多言語対応

  • Transcribe連携(自動字幕)
  • Translate連携(翻訳)
  • WebVTT埋め込み

5. 視聴分析

  • CloudFrontログ分析
  • Athena + QuickSight
  • コンテンツ人気度ダッシュボード

想定コストと削減方法

月額概算コスト(月間500本 × 平均30分処理想定)

サービス内訳月額コスト
MediaConvert500本 × 30分 × 5出力 = 1,250時間$625
Amazon S3入力500GB + 出力2TB$55
AWS Lambda処理関数実行$5
Step Functions500ワークフロー$0.15
CloudFront5TB転送$425
DynamoDBオンデマンド$2
SNS通知$0.50
CloudWatchログ$10
合計約$1,123(約168,000円)

コスト削減のポイント

  1. MediaConvertの最適化

    • On-Demand vs Reserved Capacity
    • 品質レベルの調整(SINGLE_PASS vs MULTI_PASS)
    • → 最大30%削減
  2. S3ストレージクラス

    • 入力: Standard(一時)→ 処理後削除
    • 出力: Intelligent-Tiering
    • → ストレージコスト40%削減
  3. CloudFront Reserved Capacity

    • 年間契約で割引
    • → 配信コスト最大30%削減
  4. 不要解像度の削除

    • 4K対応が不要なら4K出力を削除
    • → MediaConvertコスト削減

リソース削除手順

bash
# CloudFront(コンソールから無効化→削除)

# S3
aws s3 rm s3://video-app-master-${ACCOUNT_ID} --recursive
aws s3 rm s3://video-app-output-${ACCOUNT_ID} --recursive
aws s3 rb s3://video-app-master-${ACCOUNT_ID}
aws s3 rb s3://video-app-output-${ACCOUNT_ID}

# DynamoDB
aws dynamodb delete-table --table-name video-app-encoding-jobs

# Step Functions
aws stepfunctions delete-state-machine --state-machine-arn arn:aws:states:...

# Lambda
aws lambda delete-function --function-name video-app-trigger
aws lambda delete-function --function-name video-app-start-encoding
aws lambda delete-function --function-name video-app-check-encoding
aws lambda delete-function --function-name video-app-finalize

# SNS
aws sns delete-topic --topic-arn arn:aws:sns:...

# IAM
aws iam detach-role-policy --role-name video-appMediaConvertRole --policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess
aws iam delete-role --role-name video-appMediaConvertRole

学習のポイント

1. MediaConvertの基本

AWS の動画変換サービスとして、入力 → 出力グループ → 出力の構造を理解する。HLS/DASH などのストリーミングフォーマットの基本も押さえる。

2. イベント駆動アーキテクチャ

S3イベント → Lambda → Step Functions の流れは、バッチ処理の典型パターン。非同期処理の状態管理方法を学ぶ。

3. ABR(Adaptive Bitrate)の概念

ネットワーク状況に応じて品質を切り替えるストリーミング技術。ビットレートラダーの設計がユーザー体験に直結する。

4. CDN配信の基礎

CloudFront によるグローバル配信、キャッシュ戦略、CORSの設定など、コンテンツ配信の基本を習得する。

5. ワークフローの可視化

Step Functions でエンコード処理を可視化することで、進捗確認やエラー対応が容易になる。長時間バッチ処理では特に重要。