Ubuntu 22.04を使用して、Nginx-RTMPを使ったビデオストリーミングサーバーのセットアップ方法を教えてください。
はじめに
ストリーミングビデオには多くの用途があります。Twitchのようなサービスプロバイダーは、ウェブ探索やコミュニティ管理の側面のストリーミングに非常に人気があります。また、OBS Studioのような無料ソフトウェアは、複数の異なるストリームソースからのビデオオーバーレイをリアルタイムで組み合わせるために広く使用されています。これらのプラットフォームは非常に強力ですが、他のサービスプロバイダーに依存しないストリームをホストできる場合もあるかもしれません。
このチュートリアルでは、Nginxウェブサーバーを設定して、独立したRTMPビデオストリームをホストし、異なるアプリケーションでリンクし、表示する方法を学びます。 RTMP、リアルタイムメッセージングプロトコルは、ほとんどのインターネットビデオストリーミングの基礎を定義しています。同じ技術を使用して、より最新のプラットフォームをサポートするHLSおよびDASHストリームもホストする方法も学びます。
前提条件
このガイドを完成させるためには、以下が必要です:
- An Ubuntu 22.04 server and a non-root user with sudo privileges. You can learn more about how to set up a user with these privileges in our Initial Server Setup with Ubuntu 22.04 guide.
- Nginx installed, following How To Install Nginx on Ubuntu 22.04.
このチュートリアルでは、URLとホスト名には仮のドメイン名である your_domain を使用します。チュートリアルを進めるにあたり、自身のドメイン名やIPアドレスに置き換えてください。
ステップ1- Nginx-RTMPのインストールと設定
多くの現代のストリーミングツールは、インターネットのビデオストリームの基本パラメータを定義するRTMPプロトコルをサポートしています。Nginxウェブサーバーには、専用のURLから最小限の設定でRTMPストリームを提供するためのモジュールが含まれており、それはデフォルトでウェブページへのHTTPアクセスを提供する方法と同様です。NginxのRTMPモジュールは、Nginxと自動的に組み込まれているわけではありませんが、Ubuntu 22.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
「/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 means that RTMP will be listening for connections on port 1935, which is standard.
- chunk_size 4096 means that RTMP will be sending data in 4KB blocks, which is also standard.
- allow publish 127.0.0.1 and deny publish all mean that the server will only allow video to be published from the same server, to avoid any other users pushing their own streams.
- application live defines an application block that will be available at the /live URL path.
- live on enables live mode so that multiple users can connect to your stream concurrently, a baseline assumption of video streaming.
- record off disables Nginx-RTMP’s recording functionality, so that all streams are not separately saved to disk by default.
ファイルを保存して閉じてください。もし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-dlというYouTubeなどのストリーミングプラットフォームからビデオを取得するためのコマンドラインツールを使用して、ビデオをダウンロードすることができます。youtube-dlを使用するには、サーバー上に最新のPythonインストールが必要です。
最初に、Pythonとそのパッケージマネージャーであるpipをインストールしてください。
- sudo apt install python3-pip
次に、pipを使用してyoutube-dlをインストールしてください。
- sudo pip install youtube-dl
今、YouTubeからビデオをダウンロードするためにyoutube-dlを使用することができます。特定のビデオが思い浮かばない場合は、Silicon CloudのApp Platformを紹介するこのビデオを試してみてください。
- youtube-dl https://www.youtube.com/watch?v=iom_nhYQIYk -f mp4
Note
ダウンロードされたビデオとオーディオストリームを組み合わせて、出力はyoutube-dlとして返されます。これは通常の動作です。
[youtube] iom_nhYQIYk: Downloading webpage [download] Destination: Introducing App Platform by Silicon Cloud-iom_nhYQIYk.mp4 [download] 100% of 7.90MiB in 01:39
現在、Silicon Cloud-iom_nhYQIYk.mp4のようなタイトルを持つビデオファイルが現在のディレクトリにあります。それをストリームするためには、ffmpegをインストールしてください。
- sudo apt install ffmpeg
そして、ffmpegを使用してRTMPサーバーに送信してください。
- ffmpeg -re -i “Introducing App Platform by Silicon Cloud-iom_nhYQIYk.mp4” -c:v copy -c:a aac -ar 44100 -ac 1 -f flv rtmp://localhost/live/stream
このffmpegのコマンドは、ビデオをストリーミングに適した形式にするためにいくつかの作業を行っています。詳細には触れませんが、以下のようにさまざまなオプションを理解することができます。
- -re specifies that input will be read at its native frame rate.
- -i “Introducing App Platform by Silicon Cloud-iom_nhYQIYk.mp4” specifies the path to our input file.
- -c:v is set to copy, meaning that you’re copying over the video format you got from YouTube natively.
- -c:a has other parameters, namely aac -ar 44100 -ac 1, because you need to resample the audio to an RTMP-friendly format. aac is a widely supported audio codec, 44100 hz is a common frequency, and -ac 1 specifies the first version of the AAC spec for compatibility purposes.
- -f flv wraps the video in an flv format container for maximum compatibility with RTMP.
ビデオは、ステップ1でライブの設定ブロックを定義したため、rtmp://localhost/live/streamに送信されます。”stream”はこのビデオ用に任意に選択されたURLです。
Note
ffmpegがビデオをストリーミングしている間、タイムコードを表示します。
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ストリームに接続することができます。VLC、mpv、または他のローカルにインストールされているメディアプレーヤーがある場合、メディアプレーヤーでURL rtmp://your_domain/live/streamを開くことでストリームを表示できるはずです。ffmpegがビデオ再生を終了した後、ストリームは終了します。無期限にループさせたい場合は、ffmpegコマンドの先頭に -stream_loop -1 を追加してください。
Note
デスクトップ上でOBSを使用して、静的なビデオソースをコマンドラインからストリーミングする方法を学んだので、次は動的なソースからビデオをストリーミングする方法を学びます。
ステップ3 — OBSを使ってビデオをサーバーにストリーミングする(任意)
動画再生をしたい準備ができている場合、ffmpegを使用したストリーミングは便利ですが、ライブストリーミングの方がよりダイナミックです。ライブストリーミングにおける最も人気のあるソフトウェアは、OBSまたはOpen Broadcaster Softwareです。これは無料でオープンソースであり、非常に強力です。
OBSはデスクトップアプリケーションであり、ローカルコンピュータからサーバーに接続します。
OBSをインストールした後、設定するとは、ストリームに追加するデスクトップウィンドウとオーディオソースをカスタマイズし、ストリーミングサービスの認証情報を追加することを意味します。このチュートリアルでは、ストリーミングの設定についてはカバーしません。デフォルトでは、デスクトップ全体をストリーミングするだけで動作するデモができます。ストリーミングサービスの認証情報を設定するには、OBSの設定メニューを開き、「ストリーム」オプションに移動し、以下のオプションを入力してください。
Streaming Service: Custom
Server: rtmp://your_domain/live
Play Path/Stream Key: obs_stream
obs_streamは任意に選択されたパスです。この場合、動画はrtmp://your_domain/live/obs_streamで利用可能です。認証を有効にする必要はありませんが、Step 1で設定したIPホワイトリストに追加のエントリを追加する必要があります。
サーバーに戻り、Nginxのメイン設定ファイルである/etc/nginx/nginx.confを開き、ローカルIPアドレスに対して追加の「allow publish」エントリを設定してください。自分のローカルIPアドレスが分からない場合は、「What’s my IP」などのサイトにアクセスして、それがどこからアクセスされたかを確認することがおすすめです。
- 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を再読み込みしてください。
- sudo systemctl reload nginx.service
今では、OBSの設定メニューを閉じ、メインインターフェースから「ストリーム開始」をクリックできるはずです!前と同じように、メディアプレーヤーでrtmp://your_domain/live/obs_streamでストリームを視聴してみてください。ストリーミングビデオの基本を理解したので、サーバーにいくつかの他の機能を追加して、より本番向きにすることができます。
ステップ4 — 設定に監視を追加する(オプション)
Nginx-RTMPモジュールを使用してビデオのストリーミングを設定したので、次の一般的なステップはRTMPの統計ページを有効にすることです。Nginxは、nginx.confファイルにさらに多くの設定詳細を追加する代わりに、sites-available/というサブディレクトリ内の個々のファイルにサイトごとの設定を追加することを許可しています。この場合、rtmpというファイルを作成します。
- sudo nano /etc/nginx/sites-available/rtmp
以下の内容を追加してください。 (Ika no naiyō o tsuika shite kudasai)
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 cp /usr/share/doc/libnginx-mod-rtmp/examples/stat.xsl /var/www/html/rtmp/stat.xsl
最後に、追加した統計ページへアクセスするためには、ファイアウォールで別のポートを開く必要があります。具体的には、リッスンディレクティブがポート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 – ブラウザ向けのモダンなストリームの作成 (オプション)
最後のステップとして、ユーザーがウェブブラウザを使用してサーバーから直接ビデオをストリーミングできるように、新しいストリーミングプロトコルのサポートを追加することをおすすめします。AppleのHLSとMPEG DASHの2つのプロトコルを使用して、HTTPベースのビデオストリームを作成できます。それぞれに利点と欠点がありますので、おそらく両方をサポートすることをお勧めします。
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
「/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;
}
Note
ファイルを保存して閉じてください。ここではポート8088を使用していることに注意してください。このチュートリアルでは、ポート80や443で実行しているサービスと衝突するのを避けるために、これも任意の選択肢です。一時的にファイアウォールでそのポートを開ける必要があります。
- sudo ufw allow 8088/tcp
最後に、設定ブロックと一致するようにWebルートにストリームディレクトリを作成し、NginxがHLSとDASHに必要なファイルを生成できるようにします。
- sudo mkdir /var/www/html/stream
再びNginxをリロードしてください。
- sudo systemctl reload nginx
現在、http://your_domain:8088/hls/stream.m3u8にHLSストリームが利用可能であり、http://your_domain:8088/dash/stream.mpdにDASHストリームが利用可能となりました。これらのエンドポイントは、モダンなAPIをサポートするために、RTMPビデオフィードの上に必要なメタデータを生成します。
結論
このチュートリアルで使用した構成オプションは、すべてNginx RTMP Wikiページに文書化されています。通常、Nginxモジュールは共通の構文を共有し、非常に多くの設定オプションを公開しており、ここから設定を変更するためにドキュメントを参照できます。
ほとんどのインターネットのビデオストリーミングは、RTMP、HLS、およびDASH上で実装されています。そして、このチュートリアルで探究した方法を使用することで、他の放送サービスを通じてストリームを提供したり、選択した方法で公開することができます。次に、これらの異なるビデオエンドポイントをサブドメインとして利用できるよう、Nginxをリバースプロキシとして設定する方法について読んでみることもできます。