9-10 RTMP Web Portal 機能の実践チュートリアル

前の章では、RTSP サーバー (Server) と受信側 (Client) の構築方法を学びました。RTSP の動作ロジックは通常、「サーバーがその場で待機し、クライアントが自ら積極的に接続を開始して視聴する」というものです。

しかし、今日のセルフメディアやインフルエンサーの時代において、私たちがより頻繁に遭遇するシナリオは: 「キャプチャーカードで取得したゲーム画面やカメラ映像を、YouTube、Facebook、または Twitch に直接ライブ配信するにはどうすればよいか?」というものです。

このニーズを解決するために、NexVDO SDK は強力な RTMP Web Portal Server エンジンを提供しています!RTMP (Real-Time Messaging Protocol) は、現在主要なパブリッククラウドのライブ配信プラットフォームで最も広くサポートされている通信プロトコルです。RTSP とは異なり、RTMP Web Portal は「プッシャー( 配信者 )」の役割を果たし、YouTube のサーバーに映像と音声データを積極的に送り込むことで、世界中の視聴者がウェブページを通じてあなたのライブ配信を視聴できるようにします。



© Blender Foundation | Big Buck Bunny | CC BY 3.0

© Blender Foundation | Big Buck Bunny | CC BY 3.0

コアコンセプト:RTMP プッシュ ( Push ) と RTSP プル ( Pull ) の重要な違い

API を呼び出し始める前に、まずネットワークアーキテクチャに関する非常に重要な概念を確立しておく必要があります。10-8 と 10-9 で学んだ RTSP プロトコルを思い出し、今日学ぶ RTMP プロトコルと比較してみてください。これら2つには、データ伝送の「方向性」において根本的な違いがあります:

1. RTSP は「受動的な待機 ( Pull / プル )」です" : 10-8 で構築した RTSP サーバーは、営業中のレストランのようなものです。サーバーの起動後、それは「その場で待機する」ことしかできず、クライアント(  ffplay、VLC、または私たちが独自に作成した NetReceiver など)が自ら接続に訪れ、映像を「プル(引き出す)」必要があります。
2. RTMP Web Portal は「積極的な攻撃 ( Push / プッシュ )」です: その行動パターンは完全に逆です。それは活力に満ちた配達員のようなものです!私たちは視聴者が開発ボードに接続してくるのを待つ必要はありません。その代わり、私たちのプログラムが「積極的に」、圧縮された H.264 / AAC 映像・音声データを YouTube、Facebook、Twitch などのグローバルなパブリッククラウドのサーバーに絶え間なくプッシュ(押し出す)します。

【なぜ RTMP を使うのか?】 YouTube のような大規模なプラットフォームは、世界中で数百万人が同時に視聴する状況に対応するため、世界中に巨大な CDN(コンテンツ配信ネットワーク)ノードを配置しています。彼らは、個人のコンピュータに自ら接続しに行くことを許可していません。したがって、 私たちは「送信側」の役割を果たし、彼らが指定した RTMP 受信 URL とストリームキーにストリームを自らプッシュ ( Push ) しなければなりません。 一度プッシュ配信が成功すれば、世界中の視聴者に配信するというその後の重労働はすべて YouTube のサーバーに任せることができます!これこそが、今日のすべてのライバーやインフルエンサーが簡単にライブ配信を開始できる基盤となるコア技術なのです。

➤ 重要な準備:YouTube ライブ配信の URL とストリームキーの取得

したがって、コードを書き始める前に(YouTube へのプッシュ配信を例とします)、まず YouTube サーバーの受信 URL とストリームキーを取得する必要があります。ポート番号を設定するだけで済む RTSP サーバーとは異なり、RTMP プッシュ配信は、どの URL にプッシュするかを SDK に正確に伝える必要があります。以下の準備作業を行ってください:

1. YouTube ライブダッシュボードへのログイン : ウェブブラウザを開き、YouTube チャンネルにログインし、右上隅の「作成 (Create) ➔ ライブ配信を開始 (Go live)」をクリックして、YouTube Studio のライブダッシュボードに入ります。
2. ストリーム URL ( Stream URL ) の検索 : ダッシュボードの「ストリーム設定 (Stream settings)」タブの下に、 ストリーム URL ( Stream URL ) という名前の欄があります。通常、次のような形式です:  rtmp://a.rtmp.youtube.com/live2
3. ストリームキー (Stream key) の検索 : URL の上に、隠されたパスワードの欄があります。これがあなたの ストリームキー(エンコーダに貼り付け). です。横にある「コピー ( COPY )」ボタンをクリックしてコピーしてください。このキーはあなたの専用チャンネルのパスポートなので、絶対に他の人に漏らさないでください! ( フォーマットは通常、ランダムな英数字の文字列です。例:3mtm-eyvv-ppwa-sub5-1tv2 )。

最も重要なステップ : NexVDO SDK の API には、「単一の文字列」だけを渡す必要があります。そのため、先ほどコピーした2つのテキストを手動で「シームレスに結合」させる( 間にスラッシュ  を追加する )必要があります。

• 組み合わせの公式 [Stream URL]  + [Stream key]
• 組み合わせの例 :rtmp://a.rtmp.youtube.com/live2/3mtm-eyvv-ppwa-sub5-1tv2

この「組み合わせが完了した究極の URL」を、後で使えるようにまずメモ帳に貼り付けておいてください!後ほどプロジェクトの実装で、この URL は主役の API —— QCAP_CREATE_BROADCAST_RTMP_WEB_PORTAL_SERVER.

さあ、あなただけのライブ配信プッシュ専用ツールを段階的に構築していきましょう!

コア API の理解 - RTMP ストリームプッシュエンジン

詳細なパラメータ設定に入る前に、RTMP プッシュエンジンを構築するための「標準的な API 呼び出し順序」についてマクロな視点で理解しておきましょう。これは完璧で厳密なライフサイクルですので、必ず以下の手順に従って実行してください:

標準的な使用手順は以下の通りです:

1. QCAP_CREATE_BROADCAST_RTMP_WEB_PORTAL_SERVERRTMP プッシュエンジンを作成します。
2. QCAP_SET_VIDEO_BROADCAST_SERVER_PROPERTYサーバーの映像圧縮プロパティを設定します。
3. QCAP_SET_AUDIO_BROADCAST_SERVER_PROPERTYサーバーの音声圧縮プロパティを設定します。
4. QCAP_START_BROADCAST_SERVERRTMP プッシュサーバーエンジンを起動します。
5. QCAP_SET_VIDEO_BROADCAST_SERVER_UNCOMPRESSION_BUFFERCallback 内で映像の非圧縮バッファを継続的に供給します。
6. QCAP_SET_AUDIO_BROADCAST_SERVER_UNCOMPRESSION_BUFFERCallback 内で音声の非圧縮バッファを継続的に供給します。
7. QCAP_STOP_BROADCAST_SERVERRTMP プッシュサーバーエンジンを停止します。
8. QCAP_DESTROY_BROADCAST_SERVER RTMP プッシュサーバーエンジンを解放(破棄)します。

上記のプロセスの概念を確立したところで、次に RTMP プッシュを担当するコア API の重要なパラメータを1つずつ分解して見ていきましょう!

QCAP_CREATE_BROADCAST_RTMP_WEB_PORTAL_SERVER

この API は RTMP プッシュオブジェクトの作成を担当します。ポート番号を設定するだけで済む RTSP とは異なり、ここでは YouTube や Facebook から取得した 「Stream URL + Stream Key(サーバー URL とストリームキー)」 を1つの文字列に結合し、直接 pszURL パラメータに供給(フィード)する必要があります。

QCAP_SET_VIDEO_BROADCAST_SERVER_PROPERTY

サーバーがブロードキャストする前に、映像をどのように圧縮するかを設定する必要があります。

⚠️ 落とし穴回避ガイド:RTMP プロトコルには非常に厳格なフォーマット制限があります。映像エンコードは H.264 に指定する必要があります。そうしないと、YouTube はあなたの映像を解析( パース )できません!

QCAP_SET_AUDIO_BROADCAST_SERVER_PROPERTY

サーバーがブロードキャストする前に、音声をどのように圧縮するかを設定する必要があります。

⚠️ 落とし穴回避ガイド:RTMP プロトコルには非常に厳格なフォーマット制限があります。音声エンコードは AAC_ADTS に指定する必要があります。そうしないと、YouTube はあなたの映像を解析( パース )できません!

QCAP_START_BROADCAST_SERVER

映像・音声プロパティの設定が完了したら、この API を使用して正式にエンジンを起動し、YouTube などのプラットフォームへのデータプッシュを開始します。

QCAP_SET_VIDEO_BROADCAST_SERVER_UNCOMPRESSION_BUFFER

開発者のヒント : 入力された画面をクロッピング( 切り抜き )する必要がある場合は、代わりに末尾に _EX  が付くバージョンの API を使用してください。

QCAP_SET_AUDIO_BROADCAST_SERVER_UNCOMPRESSION_BUFFER

開発者のヒント : ここでの pFrameBuffer の音声フォーマットが、前に QCAP_SET_AUDIO_BROADCAST_SERVER_PROPERTYで設定したフォーマットと異なる場合、ユーザーは末尾に _EX が付くバージョンの API を使用して、入力音声の実際のフォーマットをエンジンに伝える必要があります!

QCAP_STOP_BROADCAST_SERVER

ブロードキャストを終了する必要がある場合、この API を呼び出すと、SDK はストリームのプッシュ配信を停止します。

QCAP_DESTROY_BROADCAST_SERVER

ブロードキャストを終了する必要がある場合、この API を呼び出すと、SDK はサーバーエンジンを解放し、システムとネットワークのリソースを解放( 破棄 )します。

UI 表示インターフェースの構築

Qt Creator を開き、 9-3 基礎テンプレートプロジェクトの作成:Hello NexVDO SDK! を参考にして、YouTube の URL を入力でき、起動/停止ボタンを備えたインターフェースを配置します。

プロジェクトの作成とコンポーネントの配置

mainwindow.uiを開き、 QLineEdit  ( 1行テキスト入力ボックス) をドラッグして、 objectName を StrURL と命名します。これは、ユーザーが YouTube から提供された長い URL を貼り付けるために使用されます。

RTMP コントロールボタン ( QPushButton ) の作成

2つの QPushButton をドラッグし、テキストをそれぞれ 「START RTMP」 と 「STOP RTMP」に変更します。

ボタンコントロールイベントのバインド( 関連付け )

完了後、ボタンを右クリックして 「Go to slot... ( スロットへ移動 )」 を選択し、スロット関数を作成します。

コアコードの記述

インターフェースの配置が完了したら、 mainwindow.cpp と  mainwindow.h に入ってコアロジックを記述します。ここでは、「ヘッダーファイルと変数の準備」、「安全な終了(セーフエグジット)メカニズム」、「接続の開始と停止」、そして最も重要な「Callback の傍受(インターセプト)とトラフィック統計」の4つの部分に分けて説明します。

初期ボタンのフールプルーフと安全な終了メカニズム

ボタンが用意できたら、コード内に2つの非常に重要な保護対策を追加する必要があります。まず、プログラムが起動したばかりの時はサーバーがまだ開いていないため、「STOP RTMP」ボタンはクリックできないグレーアウトの状態になっている必要があります。 mainwindow.cpp のコンストラクタ MainWindow::MainWindow(...) を開き、ポート番号の初期化の下に、ボタンの初期フールプルーフ(エラー防止)状態を追加してください:

デフォルト URL プロンプトの設定

mainwindow.cpp のコンストラクタ内で、ここに YouTube の URL を貼り付けるようユーザーに促すため、入力ボックスにデフォルト文字列 "set_URL_here" を設定します:

実装:START RTMP ロジック

START ボタン内で、入力ボックスから URL を読み取り、H.264/AAC_ADTS プロパティを設定し、ストリームのプッシュ配信を開始します!

 開発者必修の「パラメータ連動」の極意 : 実践開発において、 Format Changed Callback がトリガーされた時に、ついでに最新のデータをこれらの変数に保存しておく ことを強くお勧めします。マルチストリームエンジンを起動する準備ができ、複雑なコーデックパラメータを設定する必要がある時に、これらの変数をそのまま API に渡すことができます!これには3つの大きな利点があります:

1. 完全な手動設定不要のエラー防止( フールプルーフ ) : コード内に幅、高さ、フレームレートを「ハードコーディング( 固定値として記述 )」する必要がありません。
2. 入力ソースとの完璧なマッチング : エンコーダ (Encoder) が受信する解像度が、現在のハードウェアキャプチャ状態と 100% 一致することを保証します。
3. 動的な変化へのシームレスな適応 : ユーザーが途中で異なる解像度のカメラに変更した場合でも、次回の起動時にパラメータが自動的に更新されます!

実装:STOP RTMP ロジック

停止ボタンでは、Stop ( 停止 ) だけでなく、Destroy ( 破棄 ) も絶対に忘れないでください!

Callback のスイッチボードでネットワーク映像を供給する

サーバーの準備は整いましたが、現在その中には映像がありません!ハードウェア信号の処理専用である Callback スイッチボード(メイン処理)に戻り、キャプチャしたすべての NV12 映像と PCM 音声を絶え間なくサーバーに供給(フィード)する必要があります。

➤ Callback の概念の復習 : 9-5 ステータスコールバックと画像スナップショット機能のサンプル

最終確認( 動作検証 )

プログラムを書き終えたら、いよいよ結果を検証する時間です! NetBroadcaster プロジェクトをコンパイルして実行し、カメラの映像が正常に表示されることを確認したら、以下の手順に従って操作してください :

1. YouTube ライブストリームキーの取得 : ウェブブラウザを開き、YouTube チャンネルにログインして 「YouTube Studio」に入ります。右上隅の 「ライブ配信を開始 (Go live)」 をクリックします。

2. 完全な URL のコピー : ライブダッシュボードに、「ストリーム URL (Stream URL)」と「ストリームキー ( Stream key )」が表示されます。 これら2つを組み合わせてください ( 例 : rtmp://a.rtmp.youtube.com/live2/Stream key ).

3. ワンクリックで配信開始! プログラムのインターフェースに戻り、先ほど組み合わせた URL を StrURL 欄に貼り付け( 元の set_URL_here を置き換えます )、思い切って 「START RTMP」を押してください!


© Blender Foundation | Big Buck Bunny | CC BY 3.0

4. 成果を楽しむ : ネットワークのバッファリング時間として約10〜20秒待つと、YouTube のライブ管理画面(バックエンド)に「接続状態:非常に良好 (Excellent connection)」と表示されます。そして、あなたのカメラ映像がスムーズに YouTube 上に表示され、世界中の視聴者が見られるようになります!

© Blender Foundation | Big Buck Bunny | CC BY 3.0

おめでとうございます!チュートリアルに沿ってここまで進み、最も基本的な映像キャプチャや録画の保存から、今日の YouTube ライブへの映像プッシュ配信の成功まで、あなたは実は NexVDO SDK の中で最もコアであり、実際のプロジェクトで最も頻繁に使用されるいくつかの機能を密かにすべて習得しました!この基礎ができたことで、今後どのようなオーディオ・ビデオ開発のニーズに直面しても、より一層使いこなし、頭の中のアイデアを簡単に実際のソフトウェア製品へと変えることができると信じています!

Copyright © 2026 YUAN High-Tech Development Co., Ltd.
All rights reserved.