はじめに
地方のイベントや観光地からプロ機で高品質なライブ配信をしたい、というニーズは意外と多いのですが、「現場にPCを持ち込みたくない」「モバイル回線を束ねて帯域を稼ぎたい」「テロップは自宅でじっくり乗せたい」という要求を全部満たす構成はあまり解説記事がありませんでした。
この記事では、Sony PXW-FS7 II(業務用ビデオカメラ)の映像を、福井県の一乗谷朝倉氏遺跡から、自宅PCのOBS Studio経由でYouTubeとXに同時配信するという構成を実際に組んで動かすまでの記録をまとめます。
途中で設計変更が何度か入ったので、「なぜこの構成になったか」の思考過程も含めて書きます。
目指す要件
- 業務用カメラ(Sony FS7 II)の映像を配信に使いたい
- 現場にノートPCを持ち込まず、iPhone単体で送信したい
- モバイル回線の帯域不足・瞬断に強くしたい(ボンディング)
- 自宅でテロップを乗せてから配信したい
- YouTubeとXに同時配信したい
- 現場から配信シーンを切り替えたい(テロップON/OFFなど)
全体構成
ポイントは3つあります。
- 現場iPhone → AWS EC2 → 自宅OBSという3段の経路にしてある
- SpeedifyでiPhone上で3回線をボンディングしている
-
制御はAndroidから別経路で行っている
ひとつずつ理由を書いていきます。
使用した機材・環境
現場機材
| 用途 | 機材 |
|---|---|
| カメラ | Sony PXW-FS7 II(1080p出力) |
| HDMI→iPhone変換 | Accsoon SeeMo(無印) |
| 送信iPhone | iPhone 16 Pro Max(iOS 26.4.2) |
| Pair & Share提供&OBS制御 兼用Android | ZTE A202ZT |
| ポケットWi-Fi | MS4GRA01(マルチキャリア自動選択SIM) |
通信回線
| 回線 | キャリア |
|---|---|
| iPhone自身のSIM | HIS Mobile(docomo回線) |
| ポケットWi-Fi(MS4GRA01) | Softbank |
| Pair & Share提供Android | povo(KDDI回線) |
| 自宅 | こしの都ネットワーク(上り実効約930Mbps) |
3キャリアが重ならないようにするのが肝で、それぞれdocomo・Softbank・KDDIに分散しているので、特定キャリアの基地局が混雑しても他の回線で押し切れます。
Speedify
| 項目 | 値 |
|---|---|
| プラン | 個人プラン(送信iPhoneのみ契約) |
| Pair & Share提供側 | 無料プラン(月2GB上限)でOK |
中継サーバー(AWS EC2)
| 項目 | 値 |
|---|---|
| リージョン | ap-northeast-1(東京) |
| インスタンスタイプ | t3.small |
| OS | Ubuntu Server 22.04 LTS |
| ストレージ | 30 GiB(gp3) |
| nginx | 1.24.0(ソースビルド) |
| nginx-rtmp-module | arut/nginx-rtmp-module(GitHubから取得) |
自宅側(OBS用PC)
| 項目 | 値 |
|---|---|
| OS | Windows 11 25H2(26200.8328) |
| CPU | Intel Core i5-14500 |
| RAM | 32 GB |
| GPU | NVIDIA GeForce RTX 4060 Ti |
| OBS Studio | 32.1.2 |
| obs-multi-rtmpプラグイン | 最新版 |
| ルーター | G-2425G-B |
配信品質設定
| 配信先 | 解像度 | fps | ビットレート | エンコーダー |
|---|---|---|---|---|
| YouTube Live | 1920×1080 | 30 | 6,000 kbps | NVIDIA NVENC H.264 |
| X (Media Studio Producer) | 1920×1080 | 30 | 10,000 kbps | NVIDIA NVENC H.264 |
X側のビットレートをYouTubeより高めに設定しているのは、Xの方が再エンコード時の劣化が大きい印象があったため、入力段で帯域を多めに確保しています。RTX 4060 TiのNVENCで2系統同時エンコードしてもCPU負荷はほぼゼロです。
なぜこの構成なのか
なぜ直接配信しないのか
配信する映像に、テロップや、配信開始までの映像を載せたかったが、カメラ、スイッチャ、テロップだしまでワンオペで対応しており、PCを持って操作する余裕がなかった。
また、複数の配信先(YouTube・X)への送出を行いたかったが、帯域が限られている屋外では同時転送が厳しかったため、今回のように自宅PCへ送り帯域に余裕のある自宅PCより各配信先へ送出することとした。
なぜAWS EC2を中継に挟むのか
最初は「現場iPhone → 自宅OBS」を直接繋ごうとしました。しかし自宅PCはルーターの内側にいるので、外部から直接RTMPを送ることはできません。既にEC2上でnginx-rtmpを別プロジェクトで動かしていたので、それを中継として流用することにしました。
# /etc/nginx/nginx.conf (抜粋)
rtmp {
server {
listen 1935;
chunk_size 4096;
application live_home {
live on;
record off;
allow play all;
drop_idle_publisher 10s;
}
}
}
既存のアプリケーションと共存できるよう、今回用にlive_homeという新しいアプリケーションを追加しています。
認証はどうするか
最初はトークン認証を仕込もうとしました。
on_publish http://127.0.0.1:8080/auth;
しかしAccsoon SEEアプリがRTMP URLのクエリ文字列(?token=...)を正しく送出しないことが判明し、この方式は諦めました。代わりにStream Key自体を推測困難な長い文字列にする方針に変更しています。
十分なエントロピーのあるランダム文字列にすれば、それ自体がパスワード相当の強度になります。設計を簡素にしたいときは、凝った認証より長い秘密文字列のほうが結局安全で運用も楽です。
なぜSpeedifyで3回線ボンディングか
一乗谷は山間部なので、1キャリアだけだと電波が不安定です。Speedifyを使うとiPhone上で複数回線を束ねてVPNトンネル化してくれます。
制約として、iOSのSpeedifyはWi-Fiとセルラーの2系統までしか直接掴めないのですが、今回は3回線にしたかったのでPair & Share機能を活用しました。
iPhone (Speedify本体)
├─ Cellular: iPhone自身のSIM (HIS Mobile(docomo回線))
├─ Wi-Fi: ポケットWi-Fi経由 (Softbank)
└─ Pair & Share: Android (Speedify) が共有するセルラー (povo(KDDI回線))
※同じローカルネットワーク(ポケットWi-Fi)上のAndroidから共有
物理的な接続としては、iPhone ↔ ポケットWi-Fi ↔ Android という形で、iPhoneとAndroidが同じローカルネットワーク(ポケットWi-Fi配下)にぶら下がっています。その上でAndroid側のSpeedifyを起動しておくと、Speedifyが同一LAN上のSpeedifyユーザーを自動検出して、Androidのセルラー回線をiPhoneと共有してくれます(Pair & Share、共有あたり最大10Mbpsの制限あり)。
結果として、iPhoneから見える回線が:
- iPhone自身のCellular(HIS Mobile(docomo回線))
- ポケットWi-Fi経由のWi-Fi(Softbank)
- Pair & Shareで共有されたAndroidのCellular(povo(KDDI回線))
の3本になり、実質的に3キャリアのボンディングが成立します。
重要なのは3回線すべて異なるキャリアにすること。同じキャリアだと基地局側で詰まると共倒れします。
なぜ制御にAndroidを使ったのか
当初はiPhoneにOBS Bladeを入れて制御する構成を考えていました。しかし、iPhoneはAccsoon SEEでの映像送信に占有されてしまうため、同じ端末で制御アプリを並行して操作するのは現実的ではありません。
そこで、Pair & Share提供用に持っていくA202ZTに、OBS制御アプリも同居させる設計にしました。1台のAndroidで、
- Speedifyに対しては自身のセルラー(povo/KDDI)をPair & Shareで共有
- OBS Remote Controlアプリから自宅ルーター越しにOBS WebSocketを叩く
の両方を担います。OBS制御の通信はPair & Shareで共有しているpovo回線をそのまま使う形になりますが、制御コマンドのトラフィックは極小なので映像送出にはほぼ影響しません。
OBS Blade相当のAndroidアプリとして、調べた中では以下がありました。
- StreamCtrl:OBS WebSocket v5対応、無料、成熟
- OBS Remote Control (denksites版):ライブプレビュー機能あり、2025年11月更新
-
Stream Commander:OBS制御+SSH接続、現場サーバー管理に便利
現場で「配信に何が出てるか」を確認したかったので、ライブプレビューのあるOBS Remote Controlを採用しました。
0から構築する手順
ここまでの「なぜ」が固まったら、あとは順番に組むだけです。実際に踏んだコマンドと設定をまとめます。
Step 1. AWS EC2インスタンスの作成
AWSコンソール → EC2 → 「インスタンスを起動」で以下のように作成します。
| 項目 | 設定値 |
|---|---|
| 名前 | rtmp-relay(任意) |
| AMI | Ubuntu Server 22.04 LTS |
| インスタンスタイプ | t3.small |
| キーペア | 新規作成または既存 |
| ストレージ | 30 GiB gp3 |
ポートの穴あけ:
| タイプ | プロトコル | ポート | ソース | 用途 |
|---|---|---|---|---|
| SSH | TCP | 22 | マイIP | 管理用 |
| カスタムTCP | TCP | 1935 | 0.0.0.0/0 | RTMP受信(モバイル回線経由なのでany) |
| カスタムTCP | TCP | 8080 | マイIP | 統計ページ |
作成後、EC2 → 「Elastic IP」→ 新規割り当て → インスタンスに関連付け。これでIPが固定化されます。
Step 2. EC2上にnginx + nginx-rtmp-moduleを構築
SSHでログイン後、以下を順に流します。
# システム更新
sudo apt update && sudo apt upgrade -y
# ビルドに必要なツール
sudo apt install -y build-essential libpcre3-dev libssl-dev zlib1g-dev git wget
# ソース取得
cd /usr/local/src
sudo git clone https://github.com/arut/nginx-rtmp-module.git
sudo wget http://nginx.org/download/nginx-1.24.0.tar.gz
sudo tar -xzf nginx-1.24.0.tar.gz
cd nginx-1.24.0
# ビルド
sudo ./configure \
--prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_stub_status_module \
--add-module=../nginx-rtmp-module
sudo make
sudo make install
設定ファイルを作成します。
sudo tee /usr/local/nginx/conf/nginx.conf > /dev/null <<'EOF'
worker_processes auto;
events {
worker_connections 1024;
}
rtmp {
server {
listen 1935;
chunk_size 4096;
application live_home {
live on;
record off;
allow play all;
drop_idle_publisher 10s;
}
}
}
http {
include mime.types;
default_type application/octet-stream;
server {
listen 8080;
location /stat {
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl {
root /usr/local/src/nginx-rtmp-module;
}
}
}
EOF
systemdユニットを作成して常駐化します。
sudo tee /etc/systemd/system/nginx.service > /dev/null <<'EOF'
[Unit]
Description=nginx with rtmp module
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now nginx
sudo systemctl status nginx
ブラウザで http://<Elastic IP>:8080/stat にアクセスし、空の統計ページが見えれば成功です。
Step 3. iPhone(送信側)のセットアップ
App Storeから2つインストールします。
- Accsoon SEE(HDMI入力受信+RTMP送出)
-
Speedify(個人プラン契約)
Speedifyのおすすめ設定:
| 項目 | 値 |
|---|---|
| Operating Mode | Speed |
| Transport | TCP Multiplex |
| Priority(主要回線) | Always |
| Overflow | 50〜100 Mbps |
Overflowを高めにしておかないと、メイン回線がギリギリ生きている時にサブ回線を使わない挙動になり、山間部で帯域が足りなくなります。
Accsoon SEEのStream URL設定:
rtmp://<EC2 Elastic IP>/live_home/<長いランダムなストリームキー>
ストリームキーは推測困難な文字列を使うこと。
Step 4. Android(A202ZT)のセットアップ
Play Storeから2つインストールします。
- Speedify(無料プラン)
-
OBS Remote Control(denksites版)
Speedifyの設定:起動してログイン後、メニューから「Pair & Share」→「Allow others to use my connection」をオン。これだけでLAN上のSpeedify本体(iPhone)から自動検出されます。
OBS Remote Controlの設定:自宅OBSのWebSocketサーバー情報を入力。
ホスト: 自宅のグローバルIP または DDNSドメイン
ポート: 自宅ルーターで開けたポート番号
パスワード: 自宅OBSのWebSocketに設定したパスワード
Step 5. ポケットWi-Fi(MS4GRA01)の準備
電源を入れて、iPhoneとA202ZTを同じSSID(今回はポケットWi-Fi)に接続させるだけです。SpeedifyのPair & Shareは同一LAN上のSpeedify同士をネットワーク経由で検出する仕様なので、ここを揃えるのが必須条件です。
Step 6. 自宅OBSのセットアップ
OBS Studio 32.1.2をインストールして、obs-multi-rtmpプラグインの最新版を入れます。
設定 → 映像:
| 項目 | 値 |
|---|---|
| 基本(キャンバス)解像度 | 1920×1080 |
| 出力(スケーリング)解像度 | 1920×1080 |
| FPS | 30(または60) |
設定 → 出力:
| 項目 | 値 |
|---|---|
| エンコーダ | NVIDIA NVENC H.264 |
| ビットレート | 6000 kbps(YouTube向けベース) |
ソース追加:
シーンに「メディアソース」を追加:
| 項目 | 値 |
|---|---|
| ローカルファイル | チェック外す |
| 入力 | rtmp://<EC2 Elastic IP>/live_home/<ストリームキー> |
| 入力フォーマット | 空欄 |
これでEC2に届いた映像をOBSが受け取れる状態になります。
obs-multi-rtmp(マルチ配信)の設定:
ドック → Multiple Output → Add new target で2つ追加:
| 配信先 | RTMP URL | ストリームキー | ビットレート |
|---|---|---|---|
| YouTube Live | rtmp://a.rtmp.youtube.com/live2/ |
YouTube Studioで取得 | 6000 kbps |
| X (Media Studio Producer) | X側で取得 | X側で取得 | 10000 kbps |
WebSocketサーバー有効化:
ツール → obs-websocket Settings:
| 項目 | 値 |
|---|---|
| Enable WebSocket server | ON |
| Server Port | 任意の値 |
| Enable Authentication | ON |
| Server Password | 強いパスワード |
Step 7. 配信先(YouTube / X)のストリームキー取得
YouTube Live
YouTube Studio → 「ライブ配信」→ 「ストリーム」→ ストリームキーをコピー → obs-multi-rtmpのYouTube枠に貼り付け。
X (Media Studio Producer)
https://studio.x.com/producer/sources にアクセス → 「New Source」を作成 → 発行されるRTMP URLとStream Keyをobs-multi-rtmpのX枠に貼り付け。
Step 8. 自宅ルーター(G-2425G-B)のポート転送
A202ZTから自宅OBSのWebSocketを叩くために、ルーターでポート転送を設定します。
G-2425G-Bの管理画面 → アプリケーション → ポートフォワーディング:
| 項目 | 値 |
|---|---|
| 外部ポート | OBS WebSocketのポート |
| 内部IP | 自宅OBS用PCのLAN内IP |
| 内部ポート | 同上 |
| プロトコル | TCP |
可能ならIPフィルタで接続元をA202ZTのキャリア(POVO/KDDI)IP帯に絞ると、外部からの不正アクセスを防げます。
Step 9. 当日の起動順
- 自宅PC(OBS、WebSocketサーバー、obs-multi-rtmp)を起動状態にしておく
- EC2インスタンスを起動
- 現場でMS4GRA01ポケットWi-Fi電源ON、iPhone・A202ZTをそれぞれ同じSSIDに接続
- iPhoneとA202ZTでSpeedify起動、iPhone側でPair & Shareの自動検出を確認
- FS7 II → SeeMo → iPhoneを物理接続、Accsoon SEEで映像確認
- Accsoon SEEで配信開始(RTMP push to EC2)
- EC2の
/statページで live_home に publisher が現れたことを確認 - 自宅OBSのメディアソースに映像が乗ったらシーン投入
- A202ZTのOBS Remote Controlからシーン切替テスト
- obs-multi-rtmpでYouTube/X両方の配信開始
配信終了後はEC2を停止して課金を止めます(t3.smallの時間単価は微々たるものですが、長期で見ると馬鹿になりません)。
実装で詰まったところ
EC2経由でOBS WebSocketをプロキシしようとした話
自宅PCを公開せずに制御通信を通したくて、一時期はEC2経由でOBS WebSocketをリバースプロキシする構成を試みました。WindowsからEC2へのリバースSSHトンネルを張り、EC2側のnginxでWebSocketをプロキシする構成です。
トンネル張りとnginxプロキシまでは成功したのですが、OBS Remote Controlアプリ側がWebSocketのパス指定に対応していなかったようで、任意パスでの接続ができずに断念しました。
帯域と遅延
送出ビットレートの目安
Accsoon SEE → EC2までの帯域は、Speedifyボンディング後の合計上り帯域次第です。
| 合計上り帯域 | 推奨ビットレート |
|---|---|
| 8Mbps以上 | 6000 Kbps (1080p60) |
| 4〜8Mbps | 4000 Kbps (1080p30) |
| 4Mbps以下 | 3000 Kbps (720p30) |
データ通信量の目安
3時間配信した場合のざっくり計算:
| 送出ビットレート | 3時間の使用量(iPhone側) |
|---|---|
| 2Mbps | 約3GB |
| 4Mbps | 約5.5GB |
| 6Mbps | 約8GB |
3回線に分散するので1回線あたりは3分の1程度。ただしSpeedifyの分配は動的なので、電波状況の良い回線に偏ります。楽天無制限やpovo2.0のトッピングを使い分けると運用が楽です。
遅延
- 現場iPhone → EC2: 2〜3秒(Speedify経由)
- EC2 → 自宅OBS: 1〜2秒
- 自宅OBS → YouTube/X: 5〜10秒
合計で15〜25秒の遅延があります。視聴者コメントとのインタラクションには使いにくいですが、テロップを手打ちで当てるにはむしろこの遅延が余裕を生んでくれます。
高品質化のために
初期設定でテストしたとき、自宅OBS側の設定がデフォルトのままで画質が落ちていました。
base resolution: 1920x1080
output resolution: 1280x720 ← ここが720pに落ちていた
fps: 30/1 ← 現場は60fpsだった
自宅OBS側(設定 → 映像)
- 出力解像度: 1280x720 → 1920x1080
- FPS: 30 → 60
なお、Accsoon SEEアプリ側では配信ビットレートや解像度の切替機能は見当たらなかったため、送出側の画質は触れません。自宅OBSで受け取ったあとの設定を詰めることで、YouTube/Xへの最終出力側で画質を確保しています。
おわりに
モバイル回線を使った業務レベルのライブ配信は、2026年現在、まだ「これ1台で全部解決」みたいな製品が少なく、いくつかのソフトとサービスを組み合わせて実現するのが現実解です。
今回の構成のメリットは:
- 現場機材が軽い(iPhone + SeeMoだけ、ノートPC不要)
- モバイル回線の冗長化(3回線で相互フェイルオーバー)
- 自宅で編集作業の自由度が高い(テロップ・トランジション・録画)
-
既存のクラウドインフラを流用(新規コスト最小限)
デメリットは: - 合計遅延が15〜25秒になる
- Speedify月額とモバイル回線代がかかる
- 自宅PCの常時稼働が必要
-
AWS構築などの専門知識が必要
現場型の配信でこの手の要件がある人の参考になれば幸いです。
参考文献・関連リンク
- 今回配信した映像
- Accsoon LiveStream Guide
- nginx-rtmp-module GitHub
- Speedify Knowledge Base
- X Media Studio Producer
- OBS WebSocket Protocol
使用した主なツール・サービス
- Sony PXW-FS7 II: 撮影機材
- Accsoon SeeMo: HDMI→iOS変換
- Speedify: 複数回線ボンディングVPNアプリケーション
- AWS EC2 (nginx-rtmp-module): RTMP中継
- OBS Studio 32.x: 受信・テロップ合成・配信
- obs-multi-rtmp: マルチ配信プラグイン
- OBS Remote Control (Android): 現場からの遠隔制御

