Start typing to search across invoices, services, domains, tickets, and more...
動画配信(VOD)やショート動画プラットフォームのバックエンドに必要なのは、元動画と変換済みファイルを保存するストレージ用専用サーバー、HLS のビットレートラダーを出力する ffmpeg トランスコードパイプライン、MinIO などの S3 互換オブジェクトストレージ、そして帯域の大半を担う CDN の 4 つです。IMIDC は香港(中国本土へ CN2 GIA)、東京、シンガポール、ロサンゼルスなどでこの基盤を提供しており、香港専用サーバーは月額 $139 から、ロサンゼルス専用サーバーは月額 $499 から、10Gbps アップリンク、DDoS 対策、IMIDC CDN も利用できます。
どの動画プラットフォームも、アップロード→元動画の保存→トランスコード→各画質の保存→CDN 配信という同じ流れをたどります。
master.m3u8 を読み込み、CDN は不足分のセグメントをストレージのオリジンから取得します。タイトル、投稿者、再生数、審査状態などのメタデータは API サーバーの通常のデータベースに、動画データそのものはストレージサーバーに置きます。
各動画を一度に複数の解像度へエンコードし、キーフレームをそろえることで、プレーヤーが画質をスムーズに切り替えられます。
mkdir -p out/v0 out/v1 out/v2 out/v3
ffmpeg -i input.mp4 \
-filter_complex "[0:v]split=4[a][b][c][d];[a]scale=-2:1080[v0];[b]scale=-2:720[v1];[c]scale=-2:480[v2];[d]scale=-2:360[v3]" \
-map "[v0]" -c:v:0 libx264 -b:v:0 5000k -maxrate:v:0 5350k -bufsize:v:0 7500k \
-map "[v1]" -c:v:1 libx264 -b:v:1 2800k -maxrate:v:1 3000k -bufsize:v:1 4200k \
-map "[v2]" -c:v:2 libx264 -b:v:2 1400k -maxrate:v:2 1500k -bufsize:v:2 2100k \
-map "[v3]" -c:v:3 libx264 -b:v:3 800k -maxrate:v:3 856k -bufsize:v:3 1200k \
-map a:0 -map a:0 -map a:0 -map a:0 -c:a aac -b:a 128k -ac 2 \
-preset medium -profile:v high -pix_fmt yuv420p \
-force_key_frames "expr:gte(t,n_forced*2)" -sc_threshold 0 \
-f hls -hls_time 4 -hls_playlist_type vod -hls_flags independent_segments \
-hls_segment_filename "out/v%v/seg_%04d.ts" \
-master_pl_name master.m3u8 \
-var_stream_map "v:0,a:0 v:1,a:1 v:2,a:2 v:3,a:3" \
out/v%v/index.m3u8
| 画質 | 解像度(16:9) | 映像ビットレート | 音声 | 想定する視聴者 |
|---|---|---|---|---|
| 1080p | 1920x1080 | 5,000 kbps | 128 kbps AAC | PC、テレビ、Wi-Fi |
| 720p | 1280x720 | 2,800 kbps | 128 kbps AAC | 電波の良い 4G/5G のスマートフォン |
| 480p | 854x480 | 1,400 kbps | 128 kbps AAC | 混雑したモバイル回線 |
| 360p | 640x360 | 800 kbps | 128 kbps AAC | 電波が弱い、データ節約モード |
-force_key_frames "expr:gte(t,n_forced*2)" はフレームレートに関係なく 2 秒ごとにキーフレームを入れ、-sc_threshold 0 で全画質の位置をそろえます。ショート動画アプリは最初のフレームが出るまでの速さが勝負なので、短いセグメント、少ない画質段数、プレビューの先読みを使います。
# vertical short video: 3-step ladder, 2 s segments for a fast first frame
ffmpeg -i clip.mp4 \
-filter_complex "[0:v]split=3[a][b][c];[a]scale=1080:-2[v0];[b]scale=720:-2[v1];[c]scale=540:-2[v2]" \
-map "[v0]" -c:v:0 libx264 -b:v:0 3500k -maxrate:v:0 3750k -bufsize:v:0 5000k \
-map "[v1]" -c:v:1 libx264 -b:v:1 2000k -maxrate:v:1 2150k -bufsize:v:1 3000k \
-map "[v2]" -c:v:2 libx264 -b:v:2 1000k -maxrate:v:2 1070k -bufsize:v:2 1500k \
-map a:0 -map a:0 -map a:0 -c:a aac -b:a 96k \
-preset medium -force_key_frames "expr:gte(t,n_forced*2)" -sc_threshold 0 \
-f hls -hls_time 2 -hls_playlist_type vod \
-hls_segment_filename "short/v%v/seg_%03d.ts" -master_pl_name master.m3u8 \
-var_stream_map "v:0,a:0 v:1,a:1 v:2,a:2" short/v%v/index.m3u8
# cover image and a small progressive MP4 preview for feeds
ffmpeg -ss 1 -i clip.mp4 -frames:v 1 -vf scale=540:-2 short/cover.jpg
ffmpeg -i clip.mp4 -t 6 -vf scale=360:-2 -c:v libx264 -b:v 400k -an -movflags +faststart short/preview.mp4
変換済みファイルは専用サーバー上の S3 互換オブジェクトストレージに保存し、視聴頻度に応じて階層化します。
# single-node MinIO on a storage dedicated server (use distributed mode across 4+ servers for HA)
docker run -d --name minio --restart unless-stopped \
-p 9000:9000 -p 9001:9001 \
-v /data/minio:/data \
-e MINIO_ROOT_USER=vodadmin \
-e MINIO_ROOT_PASSWORD=replace-with-a-long-random-secret \
minio/minio server /data --console-address ":9001"
# buckets: raw uploads (private) and hls output (public read via CDN)
mc alias set vod http://127.0.0.1:9000 vodadmin replace-with-a-long-random-secret
mc mb vod/raw
mc mb vod/hls
mc anonymous set download vod/hls
mc ilm rule add vod/raw --expire-days 180 # drop raw uploads after 180 days
mc mirror --overwrite out/ vod/hls/videos/abc123/
MinIO は AGPLv3 ライセンスで、コミュニティ版の配布形態は変更されてきたため、本番利用前に現行のエディションとライセンスを確認してください。SeaweedFS、Garage、Ceph RGW も S3 互換の選択肢です。この例の raw バケットはアップロードの一時置き場にすぎないため、元動画や高画質のメザニンファイルは再トランスコード用にコールドストレージへ保管してください。
| 階層 | 保存するもの | ハードウェア | アクセス傾向 |
|---|---|---|---|
| ホット | 新着・人気動画の変換済みファイル | NVMe/SSD のストレージサーバー | CDN からの取得が常時発生 |
| ウォーム | ロングテールの変換済みファイル | 大容量 HDD RAID やイレイジャーコーディングの専用サーバー | 時々の取得、CDN のキャッシュミス |
| コールド | 元動画とメザニンファイル | 大容量 HDD サーバーやコロケーションのストレージ筐体 | 再トランスコード時のみ読み出し |
目安として、上記 4 段ラダーの合計は約 10.5 Mbps、動画 1 分あたり約 79 MB です。1,000 時間のコンテンツなら変換済みファイルだけで約 4.7 TB、これに元動画が加わります。
動画プラットフォームの最大のランニングコストはストレージではなく帯域なので、サーバーを選ぶ前に見積もりましょう。
| 1 日のアクティブ視聴者 | 1 人あたり視聴時間 | 平均配信ビットレート | 月間配信量 |
|---|---|---|---|
| 1,000 | 20 分 | 1.5 Mbps | 約 6.75 TB |
| 10,000 | 20 分 | 1.5 Mbps | 約 67.5 TB |
| 50,000(ショート動画) | 30 分 | 1.2 Mbps | 約 405 TB |
| 100,000 | 20 分 | 1.5 Mbps | 約 675 TB |
Cache-Control を設定し、パージではなくパスのバージョン管理で更新します。オリジンは視聴者がいて、そこへの経路が最も強い場所に置きます。
| ロケーション | 主な視聴者 | 経路・IP の特徴 |
|---|---|---|
| 香港 | 中国本土、香港、中国語ユーザー | 中国電信 CN2 GIA(AS4809)、ホスティングに ICP 届出不要 |
| 日本・東京 | 日本、韓国 | 日本のネイティブ IP。VPS では中国向け CN2 最適化ルートを選択可能 |
| シンガポール | 東南アジア、インド、オセアニア | 営業経由で個別に構成 |
| 米国・ロサンゼルス | 米州、プレミアム回線経由の中国ユーザー | 聯通 9929/4837 と CN2 ルート |
| 台北 / バンコク / クアラルンプール | 単一市場向けプラットフォーム | ローカルのネイティブ IP |
多くのプラットフォームは CDN の背後に主オリジン(香港か東京が多い)を 1 つ置き、遠方地域からのキャッシュミスが遅くなってから 2 つ目のオリジンを追加しています。
動画プラットフォームはユーザーの投稿内容への対応責任を負うため、初日からパイプラインにコンプライアンスを組み込みます。
まずはオリジン 1 台と CDN で始め、ライブラリの成長に合わせてトランスコードとストレージを分離します。
最低限、API サーバー、ffmpeg を動かすトランスコードワーカー、ストレージ用専用サーバー上の MinIO などの S3 互換ストレージ、そして CDN が必要です。IMIDC は香港、東京、ロサンゼルスなどの専用サーバーと IMIDC CDN でこの構成を支えます。
中国本土の視聴者が多いなら香港です。IMIDC の香港サーバーは中国電信 CN2 GIA を使い、ホスティングに ICP 届出も不要です。東南アジア向けはシンガポール、日韓向けは東京が適しており、IMIDC のシンガポールサーバーは営業経由で構成します。
視聴者数 × 視聴分数 × 平均ビットレートで見積もれます。1 日 1 万人が 1.5 Mbps で 20 分視聴すると、月に約 67.5 TB です。その大半は CDN が配信し、ストレージのオリジンはキャッシュミスだけを処理するのが理想です。
MinIO は広く使われている S3 互換ストレージで、専用サーバー上で HLS セグメントや元動画を保存するのに適しています。まず現行のライセンスとエディションを確認し、代替として SeaweedFS、Garage、Ceph RGW も検討してください。
必須ではありません。多コア専用サーバーで ffmpeg の CPU エンコードを行うのが、ビットあたりの画質が最も良くスケールも簡単です。アップロード量が多い場合は GPU で高速化できるので、GPU や多コア構成について IMIDC 営業にお問い合わせください。
自社の動画プラットフォームを構築しませんか?香港専用サーバーと IMIDC CDN をご覧いただくか、チケットを送信して、ストレージ・トランスコード・配信の設計を IMIDC のエンジニアにご相談ください。