目次

AWS Elemental MediaPackage v2.0 完全ガイド 2026

概要と課題

AWS Elemental MediaPackage は、ライブ・VOD コンテンツのパッケージング・配信保護・DVR サービス です。MediaLive のエンコード出力を受け取り、HLS / DASH / CMAF / MSS など複数配信フォーマットに Just-In-Time で変換し、DRM(Widevine・FairPlay・PlayReady)・タイムシフト DVR・起点配信(Origin Shield)を提供します。MediaLive → MediaPackage → CloudFront が AWS 標準ライブ配信スタックであり、大規模ライブイベント・OTT ストリーミング・スポーツ配信の中核コンポーネントです。

MediaPackage が解決する課題

単一エンコードから複数デバイス対応

  • MediaLive で 1 つのマスターエンコードストリームを出力し、MediaPackage が HLS・DASH・CMAF・MSS を Just-In-Time で生成
  • デバイスごとに別々のエンコードパスが不要 = エンコードコスト削減

ライブタイムシフト(DVR)機能

  • ライブ配信中に「前のシーンを再生したい」「見逃し再生」をサポート
  • MediaPackage は最大 336 時間のタイムシフト窓を自動管理

DRM コンテンツ保護の統合

  • Widevine・FairPlay・PlayReady を SPEKE(Secure Packager and Encoder Key Exchange)で一元管理
  • 有料 OTT サービスの不正視聴防止を別 DRM サーバー構築なしに実現

オリジン保護・スケーラビリティ

  • MediaPackage が自動スケーリングするオリジンサーバーとして機能
  • CloudFront からの大量リクエスト(数百万同時視聴者)に対応
  • Origin Shield で オリジンへの負荷を 100 倍以上削減

ライブ・VOD の同時資産化

  • Live to VOD(Harvest)機能でライブを同時に VOD 化
  • ライブイベント終了と同時にオンデマンド資産が完成

アーキテクチャ全体像

graph TB
    subgraph Sources["ソース"]
        MediaLive["MediaLive<br/>ライブエンコード"]
        S3["S3<br/>VOD ファイル"]
        CustomSource["カスタムソース<br/>(URL)"]
    end
    
    subgraph MediaPackageCore["MediaPackage"]
        Channel["チャンネル管理<br/>(ライブ・VOD)"]
        Ingest["インジェスト<br/>(HLS/RTMP 受信)"]
        Packaging["パッケージング<br/>(HLS/DASH/CMAF/MSS)"]
        DRM["DRM 処理<br/>(SPEKE)"]
    end
    
    subgraph Features["高度な機能"]
        DVR["DVR/タイムシフト<br/>(最大 336h)"]
        LiveToVOD["Live to VOD<br/>(Harvest)"]
        OriginShield["Origin Shield<br/>(保護)"]
        SSAI["SSAI 対応<br/>(MediaTailor)"]
    end
    
    subgraph Outputs["出力エンドポイント"]
        HLS["HLS エンドポイント<br/>(iOS/Apple TV)"]
        DASH["DASH エンドポイント<br/>(Android/Web)"]
        CMAF["CMAF エンドポイント<br/>(統合)"]
        MSS["MSS エンドポイント<br/>(Xbox)"]
    end
    
    subgraph Distribution["配信・視聴"]
        CloudFront["CloudFront<br/>CDN"]
        Players["プレーヤー<br/>(HLS.js/dash.js)"]
        Devices["デバイス<br/>(スマホ/TV/PC)"]
    end
    
    MediaLive -->|HLS/RTMP| Channel
    S3 -->|VOD 入力| Channel
    CustomSource -->|URL| Channel
    Channel -->|HLS/RTMP 受信| Ingest
    Ingest -->|複数フォーマット生成| Packaging
    DRM -->|DRM 暗号化| Packaging
    DVR -->|タイムシフト処理| Packaging
    LiveToVOD -->|VOD 化| Packaging
    OriginShield -->|オリジン保護| Packaging
    SSAI -->|広告対応| Packaging
    Packaging -->|出力| HLS
    Packaging -->|出力| DASH
    Packaging -->|出力| CMAF
    Packaging -->|出力| MSS
    HLS -->|格納| CloudFront
    DASH -->|格納| CloudFront
    CMAF -->|格納| CloudFront
    MSS -->|格納| CloudFront
    CloudFront -->|配信| Players
    Players -->|再生| Devices

MediaPackage v1 vs v2 比較

graph LR
    subgraph v1["MediaPackage v1<br/>(従来)"]
        A["Channel / Origin Endpoint<br/>API 型"]
        B["Linear/VOD 分離<br/>独立管理"]
        C["SDK サポート限定<br/>(AWS SDK のみ)"]
    end
    
    subgraph v2["MediaPackage v2<br/>(2024- GA)"]
        D["Unified API<br/>(REST)"]
        E["Live/VOD 統合<br/>Harvest で同時化"]
        F["OpenAPI / gRPC<br/>(ベンダー中立)"]
        G["100k+ 同時視聴<br/>(スケール強化)"]
    end
    
    v1 -->|2024 年移行開始| v2

コアコンポーネント詳説

1. Channel(チャンネル)

ライブ・VOD コンテンツの入力点。

チャンネルの役割

  • ライブエンコードストリーム(RTMP / HLS Pull)の受信
  • VOD ファイル(S3 URL)の取り込み
  • 複数 Origin Endpoint への同時配信管理

2. Origin Endpoint(配信エンドポイント)

複数パッケージングフォーマットを提供。

エンドポイントタイプ

  • HLS_PACKAGE:Apple iOS・Apple TV 向け
  • DASH_PACKAGE:Android・Web ブラウザ向け
  • CMAF_PACKAGE:Apple Low Latency HLS(Apple フォーマット統一)
  • MSS_PACKAGE:Microsoft Smooth Streaming(Xbox)

エンドポイント設定

  • SegmentDurationSeconds:セグメント長(通常 6 秒)
  • PlaylistWindowSeconds:プレイリスト窓(DVR 対応時間)
  • TimeDelaySeconds:配信遅延(DVR 保護)
  • StartoverWindowSeconds:24 時間タイムシフト設定

3. Packaging Configuration(パッケージング設定)

暗号化・DRM・フィルタリングを定義。

設定項目

  • HLS / DASH / CMAF / MSS ごとの暗号化方式
  • DRM システム ID(Widevine・FairPlay・PlayReady)
  • Stream Selection(ビットレート範囲・言語選択)
  • Ad Markers(広告マーカー形式:SCTE-35・DATERANGE)

4. DRM Protection(DRM 保護)

SPEKE(Secure Packager and Encoder Key Exchange)を使用。

対応 DRM

  • Widevine:Google Play・Android・Web ブラウザ
  • FairPlay:Apple iOS・Apple TV・Safari
  • PlayReady:Windows・Xbox・Silverlight

SPEKE フロー

  • MediaPackage → SPEKE キーサーバー
  • → DRM キー取得 → HLS/DASH に暗号化情報埋め込み
  • → プレーヤーが DRM キー取得 → 再生

5. Live to VOD(Harvest)

ライブストリームを VOD 資産に変換。

Harvest ジョブ

  • ライブ配信の指定時間帯を抽出
  • S3 に VOD ファイルとして保存
  • マニフェスト・セグメント自動生成
  • ライブ配信と並行実行(ダウンタイムなし)

6. Origin Shield(オリジン保護)

CloudFront キャッシュ層とオリジン間の中間層。

効果

  • CloudFront からの多数リクエストを 1 つに集約(最大 100 倍削減)
  • オリジン(MediaPackage)への負荷軽減
  • 数百万同時視聴者対応

主要ユースケース 10+

1. OTT スポーツ配信(複数デバイス対応)

MediaLive エンコード → MediaPackage (HLS・DASH・CMAF) → CloudFront → iOS・Android・Web 同時配信

スタジアム RTMP → MediaLive 
    → HLS (MediaPackage) → CloudFront
    ├── iOS HLS ≈ 5 Mbps
    ├── Android DASH ≈ 4 Mbps  
    └── Web CMAF ≈ 3-6 Mbps(適応)

2. 24/7 リニアテレビチャンネル

Multiplex(複数プログラム)→ MediaLive → MediaPackage → MediaTailor(広告挿入)→ CloudFront

  • チャンネル A / B / C → StatMux(統計多重)
  • → MediaLive → MediaPackage → MediaTailor
  • → 個人化広告挿入 → 配信

3. ライブイベント + VOD 同時資産化

ライブ配信中に Harvest ジョブで VOD 化。

ライブ(2 時間) → MediaPackage
    ├── リアルタイム配信(視聴者)
    └── Harvest(2 時間全体)→ S3 VOD ファイル
    ↓ ライブ終了後即座に
    MediaConvert → HLS/DASH VOD → オンデマンド配信

4. DRM コンテンツ保護(有料配信)

Widevine・FairPlay 統合で複数 DRM サーバー不要。

  • プレミアムコンテンツ → MediaPackage
  • → SPEKE キーサーバー → DRM 暗号化
  • → iOS(FairPlay)/ Android(Widevine)
  • → 不正視聴防止

5. タイムシフト VOD(見逃し配信)

DVR ウィンドウを活用した 24 時間見逃し再生。

ライブ配信(StartoverWindow: 86400 秒)
    ├── リアルタイム視聴
    └── 24 時間以内なら任意時点から再生可能

6. マルチ言語配信

複数音声トラック・字幕を 1 エンドポイントで提供。

  • マスター映像 + 日本語音声 + 英語音声 + フランス語字幕
  • → HLS エンドポイント(複数オーディオトラック)
  • → プレーヤーで言語選択

7. リアルタイムビジュアル分析

MediaPackage ストリーム → Rekognition Video → リアルタイム検出(人物・顔・オブジェクト)

  • ライブ配信中 → Kinesis Video Streams
  • → Rekognition Video(顔認識・人物検出)
  • → CloudWatch メトリクス

8. CDN キャッシュ最適化(Origin Shield)

CDN からのリクエスト激増時の保護。

  • 数百万同時視聴者 → CloudFront
  • → Origin Shield(中間キャッシュ層)
  • → MediaPackage(オリジン保護)
  • ≈ 請求データ転送量 1/100

9. 複数リージョン配信

各地域向けに異なるコンテンツを同時配信。

1 ライブソース → MediaPackage
    ├── エンドポイント 1(日本)→ 日本語・日本広告
    ├── エンドポイント 2(米国)→ 英語・米国広告
    └── エンドポイント 3(EU)→ フランス語・EU 広告

10. SSAI(Server-Side Ad Insertion)統合

MediaTailor と連携して広告ブロッカー回避。

MediaPackage → MediaTailor
    ├── コンテンツストリーム取得
    ├── SCTE-35 マーカーから広告スロット検出
    ├── 広告サーバー(VAST)から取得
    └── シームレス挿入 → 視聴者

11. Harvest による自動 VOD 化

ライブ配信と同時に VOD 資産を自動生成。

  • HarvestJob(開始時刻・終了時刻指定)
  • → MediaPackage が該当期間を抽出
  • → S3 に VOD マニフェスト・セグメント保存
  • → 編集なしで即オンデマンド配信開始

12. Kubernetes・マイクロサービス統合

MediaPackage REST API で Helm・GitOps 管理。

  • helm install mediapackage-stack/ \
  • –values config-dev.yaml
  • → Terraform / CloudFormation で IAC
  • → GitOps パイプラインで自動デプロイ

設定・操作の具体例

AWS CLI を使用した基本的な設定

例1: ライブチャンネル + HLS/DASH エンドポイント

#!/bin/bash

# 1. チャンネル作成(ライブ配信用)
CHANNEL_ID=$(aws mediapackage create-channel \
  --id live-sports-channel \
  --description "Live sports streaming channel" \
  --query 'Channel.Id' --output text)

echo "Channel created: $CHANNEL_ID"

# 2. HLS エンドポイント(DVR なし・リアルタイム)
aws mediapackage create-origin-endpoint \
  --channel-id "$CHANNEL_ID" \
  --id hls-live-endpoint \
  --hls-package '{
    "SegmentDurationSeconds": 6,
    "PlaylistWindowSeconds": 60,
    "PlaylistType": "EVENT",
    "UseAudioRenditionGroup": false,
    "AdMarkers": "SCTE35_ENHANCED",
    "StreamSelection": {
      "StreamOrder": "ORIGINAL",
      "MinVideoBitsPerSecond": 0,
      "MaxVideoBitsPerSecond": 2147483647
    }
  }' \
  --origination ALLOW

# 3. HLS エンドポイント(DVR あり・24 時間見逃し対応)
aws mediapackage create-origin-endpoint \
  --channel-id "$CHANNEL_ID" \
  --id hls-dvr-endpoint \
  --hls-package '{
    "SegmentDurationSeconds": 6,
    "PlaylistWindowSeconds": 3600,
    "PlaylistType": "EVENT",
    "UseAudioRenditionGroup": true,
    "AdMarkers": "SCTE35_ENHANCED"
  }' \
  --startover-window-seconds 86400 \
  --time-delay-seconds 0

# 4. DASH エンドポイント(Android 向け)
aws mediapackage create-origin-endpoint \
  --channel-id "$CHANNEL_ID" \
  --id dash-endpoint \
  --dash-package '{
    "SegmentDurationSeconds": 6,
    "ManifestWindowSeconds": 60,
    "MinBufferTimeSeconds": 6,
    "SuggestedPresentationDelaySeconds": 0,
    "StreamSelection": {
      "StreamOrder": "ORIGINAL"
    }
  }'

# 5. CMAF エンドポイント(Low Latency HLS)
aws mediapackage create-origin-endpoint \
  --channel-id "$CHANNEL_ID" \
  --id cmaf-ll-endpoint \
  --cmaf-package '{
    "SegmentDurationSeconds": 2,
    "StreamSelection": {
      "StreamOrder": "ORIGINAL"
    }
  }'

echo "Endpoints created for channel: $CHANNEL_ID"

例2: DRM(SPEKE)+ DVR 統合エンドポイント

# DRM + DVR 統合設定
aws mediapackage create-origin-endpoint \
  --channel-id "$CHANNEL_ID" \
  --id dash-drm-dvr-endpoint \
  --dash-package '{
    "SegmentDurationSeconds": 6,
    "ManifestWindowSeconds": 600,
    "Encryption": {
      "RoleArn": "arn:aws:iam::123456789012:role/MediaPackageSpekeRole",
      "SpekeKeyProvider": {
        "CertificateArn": "arn:aws:acm:ap-northeast-1:123456789012:certificate/xxxxx",
        "ResourceId": "resource-123",
        "SystemIds": [
          "edef8ba9-79d6-4ace-a3c8-27dcd51d21ed",
          "94ce86fb-07ff-4f43-adb8-93d2fa968ca2"
        ],
        "Url": "https://speke-endpoint.example.com/v1/copyProtection"
      }
    },
    "StreamSelection": {
      "StreamOrder": "ORIGINAL"
    }
  }' \
  --startover-window-seconds 86400 \
  --origination ALLOW

例3: Live to VOD(Harvest)ジョブ

# Harvest ジョブ作成(ライブの 1 時間を VOD 化)
aws mediapackage create-harvest-job \
  --id harvest-job-001 \
  --channel-id "$CHANNEL_ID" \
  --start-time 2026-04-26T10:00:00Z \
  --end-time 2026-04-26T11:00:00Z \
  --origin-endpoint-id hls-dvr-endpoint \
  --s3-destination '{
    "BucketName": "my-vod-bucket",
    "ManifestKey": "harvested/sports-game-001/manifest.m3u8",
    "RoleArn": "arn:aws:iam::123456789012:role/MediaPackageHarvestRole"
  }'

echo "Harvest job started for VOD conversion"

Python SDK による動的エンドポイント管理

import boto3
import json
from datetime import datetime, timedelta

class MediaPackageManager:
    def __init__(self, region='ap-northeast-1'):
        self.client = boto3.client('mediapackage', region_name=region)
    
    def create_live_channel(self, channel_id, description):
        """ライブチャンネル作成"""
        response = self.client.create_channel(
            Id=channel_id,
            Description=description
        )
        return response['Channel']
    
    def create_hls_live_endpoint(self, channel_id, endpoint_id, dvr_window_seconds=None):
        """HLS エンドポイント作成"""
        hls_package = {
            'SegmentDurationSeconds': 6,
            'PlaylistWindowSeconds': 60 if not dvr_window_seconds else dvr_window_seconds,
            'PlaylistType': 'EVENT',
            'AdMarkers': 'SCTE35_ENHANCED',
            'StreamSelection': {
                'StreamOrder': 'ORIGINAL',
                'MinVideoBitsPerSecond': 0,
                'MaxVideoBitsPerSecond': 2147483647
            }
        }
        
        params = {
            'ChannelId': channel_id,
            'Id': endpoint_id,
            'HlsPackage': hls_package,
            'Origination': 'ALLOW'
        }
        
        if dvr_window_seconds:
            params['StartoverWindowSeconds'] = dvr_window_seconds
        
        response = self.client.create_origin_endpoint(**params)
        return response['OriginEndpoint']
    
    def create_dash_endpoint(self, channel_id, endpoint_id):
        """DASH エンドポイント作成"""
        response = self.client.create_origin_endpoint(
            ChannelId=channel_id,
            Id=endpoint_id,
            DashPackage={
                'SegmentDurationSeconds': 6,
                'ManifestWindowSeconds': 60,
                'MinBufferTimeSeconds': 6,
                'StreamSelection': {
                    'StreamOrder': 'ORIGINAL'
                }
            }
        )
        return response['OriginEndpoint']
    
    def create_cmaf_ll_endpoint(self, channel_id, endpoint_id):
        """CMAF Low Latency エンドポイント作成"""
        response = self.client.create_origin_endpoint(
            ChannelId=channel_id,
            Id=endpoint_id,
            CmafPackage={
                'SegmentDurationSeconds': 2,  # Low Latency
                'StreamSelection': {
                    'StreamOrder': 'ORIGINAL'
                }
            }
        )
        return response['OriginEndpoint']
    
    def create_drm_endpoint(self, channel_id, endpoint_id, speke_url, resource_id, cert_arn):
        """DRM(SPEKE)対応エンドポイント"""
        response = self.client.create_origin_endpoint(
            ChannelId=channel_id,
            Id=endpoint_id,
            DashPackage={
                'SegmentDurationSeconds': 6,
                'Encryption': {
                    'SpekeKeyProvider': {
                        'CertificateArn': cert_arn,
                        'ResourceId': resource_id,
                        'SystemIds': [
                            'edef8ba9-79d6-4ace-a3c8-27dcd51d21ed',  # Widevine
                            '94ce86fb-07ff-4f43-adb8-93d2fa968ca2'   # FairPlay
                        ],
                        'Url': speke_url
                    }
                }
            }
        )
        return response['OriginEndpoint']
    
    def create_harvest_job(self, channel_id, endpoint_id, bucket_name, manifest_key, 
                          start_time, end_time):
        """Live to VOD Harvest ジョブ"""
        response = self.client.create_harvest_job(
            Id=f"harvest-{int(datetime.now().timestamp())}",
            ChannelId=channel_id,
            OriginEndpointId=endpoint_id,
            StartTime=start_time,
            EndTime=end_time,
            S3Destination={
                'BucketName': bucket_name,
                'ManifestKey': manifest_key,
                'RoleArn': 'arn:aws:iam::123456789012:role/MediaPackageHarvestRole'
            }
        )
        return response['HarvestJob']
    
    def get_endpoint_url(self, channel_id, endpoint_id):
        """エンドポイント URL 取得"""
        response = self.client.describe_origin_endpoint(
            ChannelId=channel_id,
            Id=endpoint_id
        )
        return response['OriginEndpoint']['Url']

# 使用例
if __name__ == '__main__':
    manager = MediaPackageManager()
    
    # チャンネル作成
    channel = manager.create_live_channel(
        channel_id='live-sports-channel',
        description='Live sports streaming'
    )
    print(f"Channel: {json.dumps(channel, indent=2, default=str)}")
    
    # HLS エンドポイント(リアルタイム)
    hls_endpoint = manager.create_hls_live_endpoint(
        channel_id='live-sports-channel',
        endpoint_id='hls-live'
    )
    print(f"HLS Live Endpoint: {hls_endpoint['Url']}")
    
    # HLS エンドポイント(DVR 24 時間)
    hls_dvr_endpoint = manager.create_hls_live_endpoint(
        channel_id='live-sports-channel',
        endpoint_id='hls-dvr',
        dvr_window_seconds=86400
    )
    print(f"HLS DVR Endpoint: {hls_dvr_endpoint['Url']}")
    
    # DASH エンドポイント
    dash_endpoint = manager.create_dash_endpoint(
        channel_id='live-sports-channel',
        endpoint_id='dash'
    )
    print(f"DASH Endpoint: {dash_endpoint['Url']}")
    
    # CMAF Low Latency
    cmaf_endpoint = manager.create_cmaf_ll_endpoint(
        channel_id='live-sports-channel',
        endpoint_id='cmaf-ll'
    )
    print(f"CMAF LL Endpoint: {cmaf_endpoint['Url']}")
    
    # Harvest ジョブ
    start = datetime.utcnow()
    end = start + timedelta(hours=1)
    
    harvest = manager.create_harvest_job(
        channel_id='live-sports-channel',
        endpoint_id='hls-dvr',
        bucket_name='my-vod-bucket',
        manifest_key='harvested/game-001/manifest.m3u8',
        start_time=start.isoformat() + 'Z',
        end_time=end.isoformat() + 'Z'
    )
    print(f"Harvest Job: {json.dumps(harvest, indent=2, default=str)}")

CloudFormation による IaC

AWSTemplateFormatVersion: '2010-09-09'
Description: 'MediaPackage Channel with Multi-Format Endpoints'

Resources:
  MediaPackageRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Service: mediapackage.amazonaws.com
            Action: 'sts:AssumeRole'
      ManagedPolicyArns:
        - 'arn:aws:iam::aws:policy/MediaPackageFullAccess'

  HarvestRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Service: mediapackage.amazonaws.com
            Action: 'sts:AssumeRole'
      Policies:
        - PolicyName: S3Access
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
              - Effect: Allow
                Action:
                  - 's3:PutObject'
                Resource: 'arn:aws:s3:::my-vod-bucket/*'

  LiveChannel:
    Type: AWS::MediaPackage::Channel
    Properties:
      Id: live-sports-channel
      Description: Live sports streaming channel

  HlsLiveEndpoint:
    Type: AWS::MediaPackage::OriginEndpoint
    Properties:
      ChannelId: !Ref LiveChannel
      Id: hls-live
      HlsPackage:
        SegmentDurationSeconds: 6
        PlaylistWindowSeconds: 60
        PlaylistType: EVENT
        AdMarkers: SCTE35_ENHANCED
        StreamSelection:
          StreamOrder: ORIGINAL
          MinVideoBitsPerSecond: 0
          MaxVideoBitsPerSecond: 2147483647
      Origination: ALLOW

  HlsDvrEndpoint:
    Type: AWS::MediaPackage::OriginEndpoint
    Properties:
      ChannelId: !Ref LiveChannel
      Id: hls-dvr
      HlsPackage:
        SegmentDurationSeconds: 6
        PlaylistWindowSeconds: 3600
        PlaylistType: EVENT
        AdMarkers: SCTE35_ENHANCED
      StartoverWindowSeconds: 86400
      Origination: ALLOW

  DashEndpoint:
    Type: AWS::MediaPackage::OriginEndpoint
    Properties:
      ChannelId: !Ref LiveChannel
      Id: dash
      DashPackage:
        SegmentDurationSeconds: 6
        ManifestWindowSeconds: 60
        MinBufferTimeSeconds: 6
        StreamSelection:
          StreamOrder: ORIGINAL

  CmafLlEndpoint:
    Type: AWS::MediaPackage::OriginEndpoint
    Properties:
      ChannelId: !Ref LiveChannel
      Id: cmaf-ll
      CmafPackage:
        SegmentDurationSeconds: 2
        StreamSelection:
          StreamOrder: ORIGINAL

Outputs:
  ChannelId:
    Value: !Ref LiveChannel
  HlsLiveUrl:
    Value: !GetAtt HlsLiveEndpoint.Url
  HlsDvrUrl:
    Value: !GetAtt HlsDvrEndpoint.Url
  DashUrl:
    Value: !GetAtt DashEndpoint.Url
  CmafLlUrl:
    Value: !GetAtt CmafLlEndpoint.Url

類似サービス比較表

項目 MediaPackage Unified Streaming Bitmovin Wowza JW Player
提供形態 マネージド SaaS SaaS セルフホスト / クラウド SaaS
HLS/DASH/CMAF
Just-In-Time パッケージング
DRM(SPEKE)
Live to VOD(Harvest)
DVR/タイムシフト ✅(336h)
Origin Shield 別料金 別料金 なし なし
AWS 統合 ネイティブ API API API API
100k+ 同時視聴対応
SSAI(MediaTailor) 限定的 限定的

ベストプラクティス

✅ 推奨事項

  1. 複数エンドポイントを同時提供

    • HLS(iOS)・DASH(Android)・CMAF(統一)を同時出力
    • 1 チャンネルで複数フォーマット提供
  2. DVR ウィンドウの適切な設定

    • スポーツ:24 時間(見逃し対応)
    • ニュース:3-6 時間(容量・コスト最適化)
    • イベント:リアルタイムのみ(PlaylistWindow: 60s)
  3. DRM + SPEKE の統合

    • Widevine・FairPlay を同時対応
    • SPEKE エンドポイントの冗長性確保
  4. Live to VOD(Harvest)の活用

    • ライブ配信と同時に Harvest ジョブ実行
    • ライブ終了後即座に VOD 資産完成
  5. Origin Shield による保護

    • 数百万同時視聴者対応時は必須
    • CDN リクエスト削減で転送コスト低減
  6. SCTE-35 マーカー対応

    • AdMarkers: SCTE35_ENHANCED で広告対応
    • MediaTailor SSAI と連携

❌ 回避すべき事項

  1. 単一フォーマット配信

    • HLS のみで Android 対応不可
    • iOS・Android・Web を同時対応すべき
  2. 無限 DVR 窓設定

    • ストレージコスト膨張
    • リテンション期間を明確に設定
  3. DRM なし有料コンテンツ配信

    • 不正視聴防止ができない
    • 有料配信は SPEKE 統合必須
  4. Origin Shield 無視

    • 大規模イベント時にオリジン過負荷
    • CDN リクエスト削減で全体コスト低減
  5. SSAI 非対応

    • クライアントサイド広告がブロッカーで削除
    • 広告収益損失
    • MediaTailor 統合で SSAI 対応
  6. Harvest 未活用

    • ライブ配信終了後の VOD 化に手作業
    • 並行実行で自動化すべき

トラブルシューティング表

症状 原因 対策
エンドポイント URL 404 チャンネル未開始 / 入力なし MediaLive から HLS/RTMP 送信確認
字幕が表示されない StreamSelection でフィルタリング PackagingConfiguration で全字幕許可
DRM 暗号化失敗 SPEKE エンドポイント接続不可 SPEKE URL 疎通確認・証明書確認
DVR ウィンドウ短すぎる PlaylistWindow 設定小 StartoverWindowSeconds 増加
Harvest ジョブ失敗 S3 バケット権限なし / 時間指定エラー IAM Role 確認 / 時間帯確認(UTC)
Origin Shield 効果なし CloudFront で Origin Shield 未設定 CloudFront で Origin Shield 有効化
マニフェスト生成遅い Just-In-Time 処理負荷 エンドポイント設定最適化・容量確認
複数言語音声が混在 AudioRenditionGroup 設定ミス StreamSelection で言語別フィルタ
SCTE-35 マーカー無視 AdMarkers 設定なし AdMarkers: SCTE35_ENHANCED に設定
ファイルサイズ巨大(Harvest) セグメント数多・期間長 Harvest 期間を短くする・セグメント長増加

2025-2026 最新動向

MediaPackage v2 新機能

  1. Unified REST API

    • v1 のレガシー API から OpenAPI / REST に移行
    • ベンダー中立・複数 SDK サポート
  2. Live to VOD(Harvest)拡張

    • 複数マニフェスト同時 Harvest
    • リアルタイム Harvest(ライブ中抽出)
  3. 100k+ 同時視聴対応

    • スケーラビリティ強化
    • Origin Shield と統合で安定配信
  4. CDN 認可の統合

    • CloudFront Secure Token と自動連携
    • 不正ダウンロード防止
  5. 低レイテンシー(Low Latency HLS)GA

    • CMAF + LL HLS で <2 秒遅延
    • テレビ放送品質を目指す
  6. DASH IOP(Interoperability Profile)対応

    • 標準準拠で互換性向上
    • 複数プレーヤー・デバイス最適化

学習リソース・参考文献

公式ドキュメント

AWS ブログ・記事

オープンソース・参考実装

ベンダー・競合サービス比較


実装チェックリスト

  • [ ] MediaPackage チャンネル作成(ライブ / VOD)
  • [ ] Input Security Group(ISG)設定
  • [ ] HLS エンドポイント作成(リアルタイム)
  • [ ] HLS エンドポイント作成(DVR 対応)
  • [ ] DASH エンドポイント作成(Android 対応)
  • [ ] CMAF エンドポイント作成(Low Latency)
  • [ ] DRM 設定(SPEKE + Widevine + FairPlay)
  • [ ] Live to VOD(Harvest)ジョブ設定
  • [ ] Origin Shield 有効化(CloudFront)
  • [ ] SCTE-35 マーカー対応(AdMarkers 設定)
  • [ ] MediaTailor SSAI 統合(広告挿入予定の場合)
  • [ ] CloudFormation / CDK で IaC 管理
  • [ ] テスト配信で複数デバイス・フォーマット確認
  • [ ] CloudWatch メトリクス・ログ監視設定

まとめ

AWS Elemental MediaPackage は、ライブ・VOD コンテンツのパッケージング・配信保護・DVR サービス です。MediaLive のエンコード出力を受け取り、HLS・DASH・CMAF・MSS を Just-In-Time で生成し、DRM(SPEKE)・タイムシフト DVR・Origin Shield・Live to VOD(Harvest)を提供します。MediaLive → MediaPackage → CloudFront が AWS 標準ライブ配信スタックであり、数百万同時視聴者対応のエンタープライズグレード配信基盤を実現します。

活用シーン:OTT ストリーミング・スポーツ配信・ライブイベント・24/7 リニアチャンネル・有料配信・見逃し配信

最大のメリット:単一エンコードから複数デバイス対応、自動 VOD 化、DRM 統合、100 万同時視聴対応

次ステップ:MediaTailor(SSAI)・CloudFront(CDN)・Rekognition Video(分析)と組み合わせて、エンドツーエンドの高度なライブ配信プラットフォームを構築


最終更新:2026-04-26 バージョン:v2.0