Ubuntu20.04でNginx-RTMPを使用してビデオストリーミングサーバーをセットアップする方法
序章
ビデオのストリーミングには多くのユースケースがあります。 Twitch などのサービスプロバイダーは、ストリーミングのWeb検出とコミュニティ管理の側面を処理するために非常に人気があり、 OBS Studio などの無料ソフトウェアは、複数の異なるストリームからのビデオオーバーレイを組み合わせるために広く使用されていますリアルタイムのソース。 これらのプラットフォームは非常に強力ですが、場合によっては、他のサービスプロバイダーに依存しないストリームをホストできるようにしたいことがあります。
このチュートリアルでは、さまざまなアプリケーションでリンクおよび表示できる独立したRTMPビデオストリームをホストするようにNginxWebサーバーを構成する方法を学習します。 リアルタイムメッセージングプロトコルであるRTMPは、ほとんどのインターネットビデオストリーミングの基本を定義します。 また、同じテクノロジーを使用して、より最新のプラットフォームをサポートするHLSおよびDASHストリームをホストする方法についても学習します。
前提条件
このガイドを完了するには、次のものが必要です。
- Ubuntu20.04サーバーとsudo権限を持つroot以外のユーザー。 これらの権限を持つユーザーを設定する方法の詳細については、 Ubuntu20.04を使用したサーバーの初期設定ガイドをご覧ください。
- Ubuntu 20.04にNginxをインストールする方法に従って、Nginxをインストールしました。
このチュートリアルでは、URLとホスト名にプレースホルダードメイン名your_domainを使用します。 チュートリアルを進めながら、これを独自のドメイン名またはIPアドレスに置き換えてください。
ステップ1—Nginx-RTMPのインストールと設定
最新のストリーミングツールのほとんどは、インターネットビデオストリームの基本的なパラメータを定義するRTMPプロトコルをサポートしています。 Nginx Webサーバーには、デフォルトでWebページへのHTTPアクセスを提供するのと同じように、専用URLから最小限の構成でRTMPストリームを提供できるモジュールが含まれています。 Nginx RTMPモジュールはNginxに自動的に含まれていませんが、Ubuntu 20.04およびその他のほとんどのLinuxディストリビューションでは、追加パッケージとしてインストールできます。
root以外のユーザーとして次のコマンドを実行して、パッケージリストを更新し、Nginxモジュールをインストールすることから始めます。
- sudo apt update
- sudo apt install libnginx-mod-rtmp
モジュールをインストールしても、ストリームの提供は自動的に開始されません。 ストリームを利用できる場所と方法を定義する構成ブロックをNginx構成ファイルに追加する必要があります。
nano
またはお気に入りのテキストエディターを使用して、Nginxのメイン構成ファイル/etc/nginx/nginx.conf
を開き、この構成ブロックをファイルの最後に追加します。
- sudo nano /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
は、/live
URLパスで使用できるアプリケーションブロックを定義します。live on
はライブモードを有効にして、複数のユーザーが同時にストリームに接続できるようにします。これは、ビデオストリーミングのベースラインの前提です。record off
は、Nginx-RTMPの記録機能を無効にするため、デフォルトでは、すべてのストリームが個別にディスクに保存されることはありません。
ファイルを保存して閉じます。 nano
を使用している場合は、Ctrl+X
を押し、プロンプトが表示されたらY
を押してEnterキーを押します。
これにより、RTMP構成の開始が提供されます。 デフォルトでは、ポート1935
でリッスンします。つまり、ファイアウォールでそのポートを開く必要があります。 サーバーの初期設定の一部としてufw
を構成した場合は、次のコマンドを実行します。
- sudo ufw allow 1935/tcp
これで、変更を加えてNginxをリロードできます。
- sudo systemctl reload nginx.service
これで、RTMPサーバーが機能するはずです。 次のセクションでは、ローカルソースとリモートソースの両方からRTMPサーバーへのストリーミングビデオについて説明します。
ステップ2—RTMPサーバーにビデオを送信する
RTMPサーバーにビデオを送信する方法は複数あります。 1つのオプションは、一般的なコマンドラインオーディオビデオユーティリティであるffmpeg
を使用して、サーバー上で直接ビデオファイルを再生することです。 サーバーにまだビデオファイルがない場合は、YouTubeなどのストリーミングプラットフォームからビデオをキャプチャするためのコマンドラインツールであるyoutube-dl
を使用してダウンロードできます。 youtube-dl
を使用するには、サーバーに最新のPythonをインストールする必要があります。
まず、Pythonとそのパッケージマネージャーpip
をインストールします。
- sudo apt install python3-pip
次に、pip
を使用してyoutube-dl
をインストールします。
- pip install youtube-dl
これで、youtube-dl
を使用してYouTubeからビデオをダウンロードできます。 念頭に置いていない場合は、このビデオを試して、DigitalOceanのアプリプラットフォームを紹介してください。
- 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
をインストールする必要があります。
- sudo apt install ffmpeg
そして、ffmpeg
を使用してRTMPサーバーに送信します。
- 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:v
はcopy
に設定されています。これは、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
がビデオをストリーミングしている間、タイムコードを出力します。
Outputframe= 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ストリームに接続できます。 VLC
、mpv
、または別のメディアプレーヤーがローカルにインストールされている場合は、メディアプレーヤーでURLrtmp://your_domain/live/stream
を開くとストリームを表示できるはずです。 ffmpeg
が動画の再生を終了すると、ストリームは終了します。 ループを無期限に継続したい場合は、-stream_loop -1
をffmpeg
コマンドの先頭に追加できます。
注: 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 のようなサイトにアクセスして、どこからアクセスしたかを確認することをお勧めします。
- sudo nano /etc/nginx/nginx.conf
. . .
allow publish 127.0.0.1;
allow publish your_local_ip_address;
deny publish all;
. . .
ファイルを保存して閉じてから、Nginxをリロードします。
- sudo systemctl reload nginx.service
これで、OBSの設定メニューを閉じて、メインインターフェイスからStart Streaming
をクリックできるようになります。 以前と同じように、メディアプレーヤーでストリームを表示してみてください。 ストリーミングビデオの基本的な動作を確認したので、サーバーに他のいくつかの機能を追加して、より本番環境に対応できるようにすることができます。
ステップ4—構成への監視の追加(オプション)
Nginx-RTMPモジュールを使用してビデオをストリーミングするようにNginxを構成したので、次の一般的な手順は、RTMP統計ページを有効にすることです。 Nginxでは、メインのnginx.conf
ファイルに構成の詳細を追加するのではなく、sites-available/
というサブディレクトリ内の個々のファイルにサイトごとの構成を追加できます。 この場合、rtmp
という名前のファイルを作成します。
- sudo nano /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
ファイルを解凍します。
- sudo mkdir /var/www/html/rtmp
- sudo gunzip -c /usr/share/doc/libnginx-mod-rtmp/examples/stat.xsl.gz > /var/www/html/rtmp/stat.xsl`
最後に、追加した統計ページにアクセスするには、ファイアウォールで別のポートを開く必要があります。 具体的には、listen
ディレクティブはポート8080
で構成されているため、そのポートでNginxにアクセスするためのルールを追加する必要があります。 ただし、他の人が自分の統計ページにアクセスできないようにすることをお勧めします。そのため、自分のIPアドレスに対してのみ許可することをお勧めします。 次のコマンドを実行します。
- sudo ufw allow from your_ip_address to any port http-alt
次に、この新しい構成をアクティブ化する必要があります。 Nginxの規則では、sites-available/
内のファイルから、sites-enabled/
という別のフォルダーへのシンボリックリンク(ショートカットなど)を、有効または無効にすることを決定したときに作成します。 明確にするためにフルパスを使用して、そのリンクを作成します。
- sudo ln -s /etc/nginx/sites-available/rtmp /etc/nginx/sites-enabled/rtmp
これで、Nginxを再度リロードして、変更を処理できます。
- 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
を開き、次の強調表示されたディレクティブを追加します。
- sudo nano /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
の下部に追加します。
- sudo nano /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つの任意の選択肢です。 今のところ、ファイアウォールでそのポートを開くこともできます。
- sudo ufw allow 8088/tcp
最後に、構成ブロックと一致するようにWebルートにstream
ディレクトリを作成します。これにより、NginxはHLSとDASHに必要なファイルを生成できます。
- sudo mkdir /var/www/html/stream
Nginxを再度リロードします:
- 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をリバースプロキシとして構成することを検討できます。