AI

動画プラットフォーム比較:PeerTube vs Owncast vs MediaCMS でYouTube代替を構築する

オープンソースラボ編集部2026年6月14日

動画プラットフォーム比較:PeerTube vs Owncast vs MediaCMS でYouTube代替を構築する

YouTubeへの依存から脱却し、自社サーバーで動画配信・ライブストリーミングをコントロールしたい組織向けにOSSセルフホスト型動画プラットフォームが充実しています。PeerTube(連合型・ActivityPub)・Owncast(ライブストリーミング特化)・MediaCMS(エンタープライズ向けVOD)の3つが2026年の主要OSS動画プラットフォームです。

セルフホスト型動画プラットフォームを使う理由

  • 完全制御: 動画の削除・制限・広告挿入をYouTubeに支配されない
  • プライバシー: 視聴者データ・アナリティクスを自社サーバーで管理→GoogleへのデータISFなし
  • 収益化の自由: Patreon・会員制・ペイウォールを自社ポリシーで実装
  • 帯域コスト削減: BitTorrent/WebRTC P2Pで視聴者同士が帯域を分担(PeerTube)

主要ツールの概要

PeerTube

2017年公開(Framasoft)、TypeScript製のOSSです。GitHubスター13k+。ActivityPub連合プロトコルベースの分散型動画プラットフォームで、異なるPeerTubeインスタンス間でVideoとFollowerを連合でき(MastodonからもPeerTubeの動画をフォロー可能)、P2P(WebTorrent)で視聴者間で帯域を分散します。

# docker-compose.yml: PeerTube
version: "3.8"
services:
  peertube:
    image: chocobozzz/peertube:production-bookworm
    restart: unless-stopped
    ports:
      - "9000:9000"
    environment:
      PEERTUBE_DB_USERNAME: peertube
      PEERTUBE_DB_PASSWORD: ${DB_PASS}
      PEERTUBE_DB_HOSTNAME: postgres
      PEERTUBE_WEBSERVER_HOSTNAME: peertube.example.com
      PEERTUBE_WEBSERVER_HTTPS: "true"
      PEERTUBE_SMTP_HOSTNAME: ${SMTP_HOST}
      PEERTUBE_SMTP_PORT: 587
      PEERTUBE_SMTP_USERNAME: ${SMTP_USER}
      PEERTUBE_SMTP_PASSWORD: ${SMTP_PASS}
      PEERTUBE_SMTP_FROM: no-reply@peertube.example.com
      PEERTUBE_ADMIN_EMAIL: admin@example.com
      PEERTUBE_SECRET: ${PEERTUBE_SECRET}
    volumes:
      - peertube_data:/data
      - peertube_config:/config
    depends_on: [postgres, redis]

  postgres:
    image: postgres:16-alpine
    environment:
      POSTGRES_DB: peertube
      POSTGRES_USER: peertube
      POSTGRES_PASSWORD: ${DB_PASS}
    volumes:
      - peertube_pg:/var/lib/postgresql/data

  redis:
    image: redis:7-alpine
    volumes:
      - peertube_redis:/data

  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./ssl:/etc/ssl

volumes:
  peertube_data:
  peertube_config:
  peertube_pg:
  peertube_redis:
# Python: PeerTube REST APIで動画を自動アップロード・管理
import requests
import os

PEERTUBE_URL = 'https://peertube.example.com'
USERNAME = 'admin'
PASSWORD = os.environ['PEERTUBE_ADMIN_PASSWORD']

def get_oauth_token() -> str:
    '''PeerTube OAuthトークンを取得'''
    # クライアントクレデンシャルを取得
    client_resp = requests.get(f'{PEERTUBE_URL}/api/v1/oauth-clients/local')
    client = client_resp.json()

    # アクセストークンを取得
    token_resp = requests.post(f'{PEERTUBE_URL}/api/v1/users/token', data={
        'client_id': client['client_id'],
        'client_secret': client['client_secret'],
        'grant_type': 'password',
        'username': USERNAME,
        'password': PASSWORD,
        'response_type': 'code',
    })
    return token_resp.json()['access_token']

def upload_video(token: str, video_path: str, title: str, description: str,
                 category: int = 1, privacy: int = 1) -> dict:
    '''動画をPeerTubeにアップロード'''
    headers = {'Authorization': f'Bearer {token}'}

    # リジューマブルアップロード初期化
    file_size = os.path.getsize(video_path)
    init_resp = requests.post(
        f'{PEERTUBE_URL}/api/v1/videos/upload-resumable',
        headers={**headers, 'Content-Type': 'application/json', 'X-Upload-Content-Length': str(file_size)},
        json={
            'name': title,
            'description': description,
            'category': category,
            'privacy': privacy,  # 1=Public, 3=Private, 4=Internal
            'language': 'ja',
            'commentsEnabled': True,
        },
    )
    upload_url = init_resp.headers.get('Location')

    # ファイルをチャンクでアップロード
    chunk_size = 10 * 1024 * 1024  # 10MB
    with open(video_path, 'rb') as f:
        offset = 0
        while True:
            chunk = f.read(chunk_size)
            if not chunk:
                break
            end = offset + len(chunk) - 1
            resp = requests.put(
                upload_url,
                headers={**headers, 'Content-Range': f'bytes {offset}-{end}/{file_size}'},
                data=chunk,
            )
            offset += len(chunk)
            print(f'アップロード進捗: {offset/file_size*100:.1f}%')
    return resp.json()

# 使用例
token = get_oauth_token()
result = upload_video(token, 'webinar.mp4', '2026年Q2 ウェビナー', '製品アップデートのウェビナー録画')
print(f'動画URL: {PEERTUBE_URL}/videos/watch/{result["video"]["shortUUID"]}')

Owncast

2020年公開、Go製のOSSです。GitHubスター9k+。ライブストリーミング特化のセルフホストOSSプラットフォームで、OBSからrtmp://でストリームを受け取りHLS変換してWebブラウザに配信します。リアルタイムチャット・絵文字・フォロワー通知(ActivityPub連合)を内蔵し、単一バイナリで動作します。

# Owncast インストール(単一バイナリ)
curl -s https://owncast.online/install.sh | bash
./owncast  # 起動(ポート8080 + RTMPポート1935)

# Docker での起動
docker run -d   -p 8080:8080   -p 1935:1935   -v owncast_data:/app/data   --name owncast   ghcr.io/owncast/owncast:latest

# OBS でのストリーム設定
# サーバー: rtmp://your-server:1935/live
# ストリームキー: OwncastのAdmin UIで設定したキー

MediaCMS

2020年公開、Python製のOSSです。GitHubスター3k+。エンタープライズ向けのVOD(Video-on-Demand)プラットフォームで、マルチユーザー・チャンネル・プレイリスト・字幕・解像度変換・HLS配信を提供します。ビデオポータル・教育プラットフォーム・社内研修動画管理に適しています。

# docker-compose.yml: MediaCMS
version: "3.8"
services:
  web:
    image: mediacms/mediacms:latest
    ports:
      - "80:80"
    environment:
      POSTGRES_DB: mediacms
      POSTGRES_USER: mediacms
      POSTGRES_PASSWORD: ${DB_PASS}
      SECRET_KEY: ${SECRET_KEY}
      FRONTEND_HOST: https://media.example.com
      MEDIA_IS_FRONTEND_ACCESSIBLE: "True"
    volumes:
      - mediacms_media:/home/mediacms.io/mediacms/media_files
    depends_on: [db, redis]

  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_DB: mediacms
      POSTGRES_USER: mediacms
      POSTGRES_PASSWORD: ${DB_PASS}
    volumes:
      - mediacms_pg:/var/lib/postgresql/data

  redis:
    image: redis:7-alpine

volumes:
  mediacms_media:
  mediacms_pg:

機能比較表

比較項目PeerTubeOwncastMediaCMS
VOD(録画配信)✅(録画保存可)✅ 最強
ライブストリーミング✅ 特化
ActivityPub連合
P2P帯域分散✅(WebTorrent)
GitHub Stars13k+9k+3k+

動画プラットフォームはその他カテゴリ/categories/miscのオープンソースコンテンツ管理ツールとして、ウェビナー録画・オンラインコース・社内研修動画を社外に流出せず完全管理するコンプライアンス要件に対応します。DevOpsカテゴリ/categories/devopsのNginxリバースプロキシ・Let's Encrypt SSL・S3互換ストレージ(MinIO・Wasabi)との組み合わせで大容量動画を低コストで配信するインフラ構成が多くの組織で採用されています。

FAQ

Q. PeerTubeとYouTubeの連合(ActivityPub)はどう機能しますか?

A. PeerTubeはActivityPubプロトコルを実装してMastodon・Pleroma等のFediverseと連合します。仕組み: ①PeerTubeのチャンネルはActivityPubのActor→Mastodonユーザーから@channel@peertube.example.comでフォロー可能②動画アップロード→Mastodonのフォロワーのタイムラインに動画が流れる③複数PeerTubeインスタンスが連合→どのインスタンスからでも他インスタンスの動画を検索・視聴・コメント可能。ピア配信(WebTorrent): 同じ動画を視聴している視聴者同士がP2Pで帯域を分担→サーバー負荷と転送コストを削減(人気動画は70%以上のトラフィックがP2P経由のケースも)。管理: 連合ポリシーでブロックリスト・許可リストを設定→悪意のあるインスタンスをブロック。

Q. OwncastでOBSからライブ配信をするための設定手順は?

A. OwncastのAdmin UIでRTMPストリームキーを設定してOBSから配信します。手順: ①Owncast起動→http://localhost:8080/adminでAdmin UI→Settings→Stream Keys→新しいキーを生成②OBS Studio: 設定→配信→サービス: カスタム→サーバー: rtmp://your-server:1935/live→ストリームキー: 手順①のキー③OBS: 配信開始→Owncastのhttp://your-server:8080で視聴者がライブを視聴可能。配信品質: OBSのエンコード設定(1080p30fps・6Mbps・H.264)でOwncastに送信→OwncastがCPUでHLS変換(720p・480p・360p)→視聴者のネット帯域に合わせて自動選択。ActivityPub: 配信開始時にフォロワー(Mastodon等)に通知が届く。

Q. PeerTubeの帯域コストを最小化するにはどうすればいいですか?

A. オブジェクトストレージ(S3)への動画オフロードとP2P帯域分散の両立が最も効果的です。①S3オフロード: PeerTubeの設定でobject_storage.enabled: truebucket_name: peertube-videos→動画ファイル(MP4・HLSセグメント)をS3互換ストレージ(Wasabi $7/TB/月・Backblaze B2 $6/TB/月)に保存→VPSの帯域消費をほぼゼロに②WebTorrent P2P: 同時視聴者数が多い動画はP2Pが機能→サーバー送信量が大幅削減(視聴者10人で同じ動画を視聴→各視聴者が約30%をP2P受信→サーバー送信70%削減)③CDN統合: CloudflareのFree CDNをNginxの上に配置→世界中からの動画リクエストをエッジキャッシュ。

Q. MediaCMSで社内研修動画ポータルを構築するポイントは?

A. ユーザーグループ・チャンネル・アクセス制御・メール通知・字幕機能を設定します。①ユーザーグループ: 「新入社員」「エンジニア」「マネージャー」グループを作成→各グループに視聴可能なチャンネルを制限②チャンネル: 「技術研修」「コンプライアンス」「製品トレーニング」等のチャンネルを作成→動画をチャンネルに整理③アクセス制御: PORTAL_WORKFLOW=private(ログイン必須)→社外への動画流出を防止④自動字幕: FFMPEG_CODEC_PROCESSORSでWhisper AIを統合→アップロード動画に自動字幕生成⑤Notificationメール: 新動画アップロード時にグループメンバーにメール通知→研修管理の効率化。

まとめ

ユースケース推奨ツール
分散型・YouTube代替・ActivityPub連合・P2PPeerTube
ライブストリーミング特化・OBS配信Owncast
VOD・社内動画ポータル・多機能管理MediaCMS

関連外部リソース

他の記事も読む

Let's Build Together

OSS導入、自社だけで悩まない。

ツール選定から構築・運用・AI活用まで、オープンソースラボ運営元のClasslessが伴走します。初回のご相談は無料です。