序章

ビデオのストリーミングには多くのユースケースがあります。 Twitch などのサービスプロバイダーは、ストリーミングのWeb検出とコミュニティ管理の側面を処理するために非常に人気があり、 OBS Studio などの無料ソフトウェアは、複数の異なるストリームからのビデオオーバーレイを組み合わせるために広く使用されていますリアルタイムのソース。 これらのプラットフォームは非常に強力ですが、場合によっては、他のサービスプロバイダーに依存しないストリームをホストできるようにしたいことがあります。

このチュートリアルでは、さまざまなアプリケーションでリンクおよび表示できる独立したRTMPビデオストリームをホストするようにNginxWebサーバーを構成する方法を学習します。 リアルタイムメッセージングプロトコルであるRTMPは、ほとんどのインターネットビデオストリーミングの基本を定義します。 また、同じテクノロジーを使用して、より最新のプラットフォームをサポートするHLSおよびDASHストリームをホストする方法についても学習します。

前提条件

このガイドを完了するには、次のものが必要です。

このチュートリアルでは、URLとホスト名にプレースホルダードメイン名your_domainを使用します。 チュートリアルを進めながら、これを独自のドメイン名またはIPアドレスに置き換えてください。

ステップ1—Nginx-RTMPのインストールと設定

最新のストリーミングツールのほとんどは、インターネットビデオストリームの基本的なパラメータを定義するRTMPプロトコルをサポートしています。 Nginx Webサーバーには、デフォルトでWebページへのHTTPアクセスを提供するのと同じように、専用URLから最小限の構成でRTMPストリームを提供できるモジュールが含まれています。 Nginx RTMPモジュールはNginxに自動的に含まれていませんが、Ubuntu 20.04およびその他のほとんどのLinuxディストリビューションでは、追加パッケージとしてインストールできます。

root以外のユーザーとして次のコマンドを実行して、パッケージリストを更新し、Nginxモジュールをインストールすることから始めます。

  1. sudo apt update
  2. sudo apt install libnginx-mod-rtmp

モジュールをインストールしても、ストリームの提供は自動的に開始されません。 ストリームを利用できる場所と方法を定義する構成ブロックをNginx構成ファイルに追加する必要があります。

nanoまたはお気に入りのテキストエディターを使用して、Nginxのメイン構成ファイル/etc/nginx/nginx.confを開き、この構成ブロックをファイルの最後に追加します。

  1. sudo nano /etc/nginx/nginx.conf
/etc/nginx/nginx.conf
. . .
rtmp {
        server {
                listen 1935;
                chunk_size 4096;
                allow publish 127.0.0.1;
                deny publish all;

                application live {
                        live on;
                        record off;
                }
        }
}
  • listen 1935は、RTMPが標準のポート1935で接続をリッスンすることを意味します。
  • chunk_size 4096は、RTMPが4KBブロックでデータを送信することを意味します。これも標準です。
  • allow publish 127.0.0.1およびdeny publish allは、他のユーザーが自分のストリームをプッシュすることを避けるために、サーバーが同じサーバーからのビデオの公開のみを許可することを意味します。
  • application liveは、/liveURLパスで使用できるアプリケーションブロックを定義します。
  • live onはライブモードを有効にして、複数のユーザーが同時にストリームに接続できるようにします。これは、ビデオストリーミングのベースラインの前提です。
  • record offは、Nginx-RTMPの記録機能を無効にするため、デフォルトでは、すべてのストリームが個別にディスクに保存されることはありません。

ファイルを保存して閉じます。 nanoを使用している場合は、Ctrl+Xを押し、プロンプトが表示されたらYを押してEnterキーを押します。

これにより、RTMP構成の開始が提供されます。 デフォルトでは、ポート1935でリッスンします。つまり、ファイアウォールでそのポートを開く必要があります。 サーバーの初期設定の一部としてufwを構成した場合は、次のコマンドを実行します。

  1. sudo ufw allow 1935/tcp

これで、変更を加えてNginxをリロードできます。

  1. sudo systemctl reload nginx.service

これで、RTMPサーバーが機能するはずです。 次のセクションでは、ローカルソースとリモートソースの両方からRTMPサーバーへのストリーミングビデオについて説明します。

ステップ2—RTMPサーバーにビデオを送信する

RTMPサーバーにビデオを送信する方法は複数あります。 1つのオプションは、一般的なコマンドラインオーディオビデオユーティリティであるffmpegを使用して、サーバー上で直接ビデオファイルを再生することです。 サーバーにまだビデオファイルがない場合は、YouTubeなどのストリーミングプラットフォームからビデオをキャプチャするためのコマンドラインツールであるyoutube-dlを使用してダウンロードできます。 youtube-dlを使用するには、サーバーに最新のPythonをインストールする必要があります。

まず、Pythonとそのパッケージマネージャーpipをインストールします。

  1. sudo apt install python3-pip

次に、pipを使用してyoutube-dlをインストールします。

  1. pip install youtube-dl

これで、youtube-dlを使用してYouTubeからビデオをダウンロードできます。 念頭に置いていない場合は、このビデオを試して、DigitalOceanのアプリプラットフォームを紹介してください。

  1. youtube-dl https://www.youtube.com/watch?v=iom_nhYQIYk

youtube-dlは、ダウンロードするビデオストリームとオーディオストリームを1つのファイルに結合するため、出力が表示されます。これは正常な動作です。

Output
[youtube] iom_nhYQIYk: Downloading webpage WARNING: Requested formats are incompatible for merge and will be merged into mkv. [download] Destination: Introducing App Platform by DigitalOcean-iom_nhYQIYk.f137.mp4 [download] 100% of 32.82MiB in 08:40 [download] Destination: Introducing App Platform by DigitalOcean-iom_nhYQIYk.f251.webm [download] 100% of 1.94MiB in 00:38 [ffmpeg] Merging formats into "Introducing App Platform by DigitalOcean-iom_nhYQIYk.mkv" Deleting original file Introducing App Platform by DigitalOcean-iom_nhYQIYk.f137.mp4 (pass -k to keep) Deleting original file Introducing App Platform by DigitalOcean-iom_nhYQIYk.f251.webm (pass -k to keep)

これで、現在のディレクトリにIntroducing App Platform by DigitalOcean-iom_nhYQIYk.mkvのようなタイトルのビデオファイルが作成されます。 ストリーミングするには、ffmpegをインストールする必要があります。

  1. sudo apt install ffmpeg

そして、ffmpegを使用してRTMPサーバーに送信します。

  1. ffmpeg -re -i "Introducing App Platform by DigitalOcean-iom_nhYQIYk.mkv" -c:v copy -c:a aac -ar 44100 -ac 1 -f flv rtmp://localhost/live/stream

このffmpegコマンドは、ストリーミングに適した形式のビデオを準備するためにいくつかのことを行っています。 これはffmpegチュートリアルではないため、あまり詳しく調べる必要はありませんが、次のようにさまざまなオプションを理解できます。

  • -reは、入力がネイティブのフレームレートで読み取られることを指定します。
  • -i "Introducing App Platform by DigitalOcean-iom_nhYQIYk.mkv"は、 inputファイルへのパスを指定します。
  • -c:vcopyに設定されています。これは、YouTubeからネイティブに取得した video形式をコピーしていることを意味します。
  • -c:aには他のパラメーター、つまりaac -ar 44100 -ac 1があります。これは、 audioをRTMP対応の形式にリサンプリングする必要があるためです。 aacは広くサポートされているオーディオコーデックであり、44100 hzは一般的な周波数であり、-ac 1は互換性のためにAAC仕様の最初のバージョンを指定します。
  • -f flvは、ビデオをflv形式のコンテナにラップして、RTMPとの互換性を最大限に高めます。

手順1でlive構成ブロックを定義したため、ビデオはrtmp://localhost/live/streamに送信され、streamはこのビデオに対して任意に選択されたURLです。

注: ffmpegオプションの詳細については、ffmpegコマンド例のコミュニティが管理するカタログであるffmprovisrを参照するか、を参照してください。 ]公式ドキュメント

ffmpegがビデオをストリーミングしている間、タイムコードを出力します。

Output
frame= 127 fps= 25 q=-1.0 size= 405kB time=00:00:05.00 bitrate= 662.2kbits/s speed=frame= 140 fps= 25 q=-1.0 size= 628kB time=00:00:05.52 bitrate= 931.0kbits/s speed=frame= 153 fps= 25 q=-1.0 size= 866kB time=00:00:06.04 bitrate=1173.1kbits/s speed=

これは標準のffmpeg出力です。 ビデオを別の形式に変換する場合、ビデオがどれだけ効率的にリサンプリングされているかを理解するのに役立つ場合がありますが、この場合は、ビデオが一貫して再生されていることを確認するだけです。 このサンプルビデオを使用すると、正確なfps= 25の増分を取得する必要があります。

ffmpegの実行中に、ビデオプレーヤーからRTMPストリームに接続できます。 VLCmpv、または別のメディアプレーヤーがローカルにインストールされている場合は、メディアプレーヤーでURLrtmp://your_domain/live/streamを開くとストリームを表示できるはずです。 ffmpegが動画の再生を終了すると、ストリームは終了します。 ループを無期限に継続したい場合は、-stream_loop -1ffmpegコマンドの先頭に追加できます。

注: ffmpegコマンドとrtmps://live-api-s.facebook.com:443/rtmp/your-facebook-stream-key。 YouTubeはrtmp://a.rtmp.youtube.com/live2のようなURLを使用します。 RTMPストリームを消費できる他のストリーミングプロバイダーも同様に動作する必要があります。

コマンドラインから静的ビデオソースをストリーミングする方法を学習したので、デスクトップでOBSを使用して動的ソースからビデオをストリーミングする方法を学習します。

ステップ3— OBSを介したサーバーへのビデオのストリーミング(オプション)

ffmpegを介したストリーミングは、再生したい準備済みのビデオがある場合に便利ですが、ライブストリーミングの方がはるかに動的です。 ライブストリーミングで最も人気のあるソフトウェアは、 OBS 、つまりオープンブロードキャスターソフトウェアです。これは無料で、オープンソースで、非常に強力です。

OBSはデスクトップアプリケーションであり、ローカルコンピューターからサーバーに接続します。

OBSをインストールした後、それを構成するということは、ストリームに追加するデスクトップウィンドウとオーディオソースをカスタマイズしてから、ストリーミングサービスの資格情報を追加することを意味します。 このチュートリアルでは、好みに応じてストリーミング構成については説明しません。デフォルトでは、デスクトップ全体をストリーミングするだけでデモを実行できます。 ストリーミングサービスのクレデンシャルを設定するには、OBSの設定メニューを開き、 Stream オプションに移動して、次のオプションを入力します。

Streaming Service: Custom
Server: rtmp://your_domain/live
Play Path/Stream Key: obs_stream

obs_streamは任意に選択されたパスです。この場合、ビデオはrtmp://your_domain/live/obs_streamで利用できます。 認証を有効にする必要はありませんが、手順1で構成したIPホワイトリストにエントリを追加する必要があります。

サーバーに戻り、Nginxのメイン構成ファイル/etc/nginx/nginx.confを開き、ローカルIPアドレスのallow publishエントリを追加します。 ローカルIPアドレスがわからない場合は、 What’s my IP のようなサイトにアクセスして、どこからアクセスしたかを確認することをお勧めします。

  1. sudo nano /etc/nginx/nginx.conf
/etc/nginx/nginx.conf
. . .
                allow publish 127.0.0.1;
                allow publish your_local_ip_address;
                deny publish all;
. . .

ファイルを保存して閉じてから、Nginxをリロードします。

  1. sudo systemctl reload nginx.service

これで、OBSの設定メニューを閉じて、メインインターフェイスからStart Streamingをクリックできるようになります。 以前と同じように、メディアプレーヤーでストリームを表示してみてください。 ストリーミングビデオの基本的な動作を確認したので、サーバーに他のいくつかの機能を追加して、より本番環境に対応できるようにすることができます。

ステップ4—構成への監視の追加(オプション)

Nginx-RTMPモジュールを使用してビデオをストリーミングするようにNginxを構成したので、次の一般的な手順は、RTMP統計ページを有効にすることです。 Nginxでは、メインのnginx.confファイルに構成の詳細を追加するのではなく、sites-available/というサブディレクトリ内の個々のファイルにサイトごとの構成を追加できます。 この場合、rtmpという名前のファイルを作成します。

  1. sudo nano /etc/nginx/sites-available/rtmp

次の内容を追加します。

/ etc / nginx / sites-available / rtmp
server {
    listen 8080;
    server_name  localhost;

    # rtmp stat
    location /stat {
        rtmp_stat all;
        rtmp_stat_stylesheet stat.xsl;
    }
    location /stat.xsl {
        root /var/www/html/rtmp;
    }

    # rtmp control
    location /control {
        rtmp_control all;
    }
}

ファイルを保存して閉じます。 この構成ブロックのstat.xslファイルは、ブラウザーでRTMP統計ページのスタイルを設定して表示するために使用されます。 以前にインストールしたlibnginx-mod-rtmpライブラリによって提供されますが、デフォルトで圧縮されているため、上記の構成と一致するように、解凍して/var/www/html/rtmpディレクトリに配置する必要があります。 これらのオプションに関する追加情報は、Nginx-RTMPドキュメントにあります。

/var/www/html/rtmpディレクトリを作成し、次のコマンドを使用してstat.xsl.gzファイルを解凍します。

  1. sudo mkdir /var/www/html/rtmp
  2. sudo gunzip -c /usr/share/doc/libnginx-mod-rtmp/examples/stat.xsl.gz > /var/www/html/rtmp/stat.xsl`

最後に、追加した統計ページにアクセスするには、ファイアウォールで別のポートを開く必要があります。 具体的には、listenディレクティブはポート8080で構成されているため、そのポートでNginxにアクセスするためのルールを追加する必要があります。 ただし、他の人が自分の統計ページにアクセスできないようにすることをお勧めします。そのため、自分のIPアドレスに対してのみ許可することをお勧めします。 次のコマンドを実行します。

  1. sudo ufw allow from your_ip_address to any port http-alt

次に、この新しい構成をアクティブ化する必要があります。 Nginxの規則では、sites-available/内のファイルから、sites-enabled/という別のフォルダーへのシンボリックリンク(ショートカットなど)を、有効または無効にすることを決定したときに作成します。 明確にするためにフルパスを使用して、そのリンクを作成します。

  1. sudo ln -s /etc/nginx/sites-available/rtmp /etc/nginx/sites-enabled/rtmp

これで、Nginxを再度リロードして、変更を処理できます。

  1. sudo systemctl reload nginx.service

これで、ブラウザでhttp://your_domain:8080/statに移動して、RTMP統計ページを表示できるようになります。 ビデオのストリーミング中にページにアクセスして更新し、ストリームの統計が変化するのを確認します。

これで、ビデオストリームを監視し、サードパーティプロバイダーにプッシュする方法を見てきました。 最後のセクションでは、サードパーティのストリーミングプラットフォームやスタンドアロンのメディアプレーヤーアプリを使用せずに、ブラウザーで直接提供する方法を学習します。

ステップ5—ブラウザ用の最新のストリームを作成する(オプション)

最後のステップとして、ユーザーがWebブラウザーを直接使用してサーバーからビデオをストリーミングできるように、新しいストリーミングプロトコルのサポートを追加することをお勧めします。 HTTPベースのビデオストリームを作成するために使用できるプロトコルは、AppleのHLSとMPEGDASHの2つです。 どちらにも長所と短所があるため、おそらく両方をサポートする必要があります。

Nginx-RTMPモジュールは両方の標準をサポートしています。 サーバーにHLSとDASHのサポートを追加するには、nginx.confファイルのrtmpブロックを変更する必要があります。 nanoまたはお好みのエディターを使用して/etc/nginx/nginx.confを開き、次の強調表示されたディレクティブを追加します。

  1. sudo nano /etc/nginx/nginx.conf
/etc/nginx/nginx.conf
. . .
rtmp {
        server {
. . .
                application live {
                    	live on;
                    	record off;
                        hls on;
                        hls_path /var/www/html/stream/hls;
                        hls_fragment 3;
                        hls_playlist_length 60;

                        dash on;
                        dash_path /var/www/html/stream/dash;
                }
        }
}
. . .

ファイルを保存して閉じます。 次に、これをsites-available/rtmpの下部に追加します。

  1. sudo nano /etc/nginx/sites-available/rtmp
/ etc / nginx / sites-available / rtmp
. . .
server {
    listen 8088;

    location / {
        add_header Access-Control-Allow-Origin *;
        root /var/www/html/stream;
    }
}

types {
    application/dash+xml mpd;
}

注: Access-Control-Allow-Origin *ヘッダーは、 CORS 、または Cross-Origin Resource Sharing を有効にします。これは、デフォルトでは無効になっています。 これは、サーバーが他のポートまたはドメインからリソースをロードする可能性があるサーバーからのデータにアクセスするすべてのWebブラウザーと通信します。 CORSは、 HLSおよびDASHクライアントとの互換性を最大化するために必要であり、他の多くのWebデプロイメントで一般的な構成を切り替えます。

ファイルを保存して閉じます。 ここではポート8088を使用していることに注意してください。これは、ポート80または443で実行しているサービスとの競合を避けるために、このチュートリアルのもう1つの任意の選択肢です。 今のところ、ファイアウォールでそのポートを開くこともできます。

  1. sudo ufw allow 8088/tcp

最後に、構成ブロックと一致するようにWebルートにstreamディレクトリを作成します。これにより、NginxはHLSとDASHに必要なファイルを生成できます。

  1. sudo mkdir /var/www/html/stream

Nginxを再度リロードします:

  1. sudo systemctl reload nginx

これで、HLSストリームがhttp://your_domain:8088/hls/stream.m3u8で利用可能になり、DASHストリームがhttp://your_domain:8088/dash/stream.mpdで利用可能になります。 これらのエンドポイントは、最新のAPIをサポートするために、RTMPビデオフィードの上に必要なメタデータを生成します。

結論

このチュートリアルで使用した構成オプションはすべて、 NginxRTMPWikiページに記載されています。 Nginxモジュールは通常、共通の構文を共有し、非常に多くの構成オプションのセットを公開します。ドキュメントを確認して、ここから設定を変更できます。

ほぼすべてのインターネットビデオストリーミングは、RTMP、HLS、およびDASHの上に実装されており、このチュートリアルで検討したアプローチを使用することで、他のブロードキャストサービスを介してストリームを提供したり、他の方法でストリームを公開したりできます。 次に、これらのさまざまなビデオエンドポイントの一部をサブドメインとして利用できるようにするために、Nginxをリバースプロキシとして構成することを検討できます。