Nginx とは?
Nginx は、多くの機能を備えたオープンソースのウェブサーバーです。これは、ロードバランサー、リバースプロキシー、メールプロキシー、HTTP キャッシュなどとして使用できます。この記事では、インターネットを介してウェブカメラからビデオやオーディオをストリームする際に使用される RTMP (Real Time Messaging Protocol) モジュールを使用して、Nginx をインストール、コンパイル、およびチューニングし、ビデオのストリーミング・ツールとして使用する方法を紹介します。
Nginx のインストールおよびチューニング、FFmpeg を介したストリーミング方法
早速、作業に入りましょう。この記事は、まだ Nginx を使用したことがない初心者の方でもすぐに取り組めるようになるためのチュートリアルです。まずは Nginx のインストールとチューニングにフォーカスし、次にストリーミングを行う方法についてサンプルコードとともに紹介します。
ステップ 1: 準備
Nginx のインストールを始める前に、作業に必要なパッケージの依存関係をいくつかインストールする必要があります。
sudo yum -y groupinstall 'Development Tools' sudo yum -y install epel-release sudo yum install openssl-devel sudo yum install -y pcre-devel
ステップ 2: Nginx のインストレーション
関連する属性をインストールした後、Nginx の公式ウェブサイトから Nginx のアーカイブをダウンロードし、CentOS マシン上で解凍する必要があります。この記事では、バージョン 1.14.0 を使用しています。
wget https://nginx.org/download/nginx-1.14.0.tar.gz tar -xzvf nginx-1.14.0.tar.gz
次に、git を使用して Nginx RTMP モジュールをクローンします。
git clone https://github.com/sergey-dryabzhinsky/nginx-rtmp-module.git
そして、ディレクトリー nginx-1.14.0
に移動して、以下のパラメーターで Nginx を構成します。
cd nginx-1.14.0/ ./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --user=nginx --group=nginx --build=CentOS --builddir=nginx-1.14.0 --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --with-select_module --with-poll_module --with-threads --with-file-aio --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_slice_module --with-http_stub_status_module --with-mail=dynamic --with-mail_ssl_module --with-stream=dynamic --with-stream_ssl_module --with-stream_realip_module --with-stream_ssl_preread_module --with-compat --add-module=../nginx-rtmp-module --with-debug
Nginx の構成が完了したら、コンパイルを行ってインストールします。
sudo make sudo make install
Nginx のバージョンおよびインストールされたモジュールは、以下のコマンドから確認できます。
nginx -V
ステップ 3: Nginx のチューニング
インストール後、Nginx ディレクトリーへのモジュールリンクを作成します。
sudo ln -s /usr/lib64/nginx/modules /etc/nginx/modules
Nginx が任意のフォルダーを使用する場合、Nginx のユーザーとグループを作成し、これらのフォルダーの所有者とグループを Nginx のユーザーとグループへ変更する必要があります。
sudo useradd -r -d /var/cache/nginx/ -s /sbin/nologin -U nginx chown -R nginx:nginx <path-to-folder-which-nginx-uses>
Nginx をサービスとして実行するため、/usr/lib/systemd/system/
のパスに沿って nginx.service
ファイルを作成し、以下のテキストを nginx.service
ファイルにコピーおよびペーストする必要があります。
[Unit] Description=nginx - high performance web server Documentation=https://nginx.org/en/docs/ After=network-online.target remote-fs.target nss-lookup.target Wants=network-online.target [Service] Type=forking PIDFile=/var/run/nginx.pid ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/nginx.conf ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s TERM $MAINPID [Install] WantedBy=multi-user.target
これらのステップがすべて終了後、ついに Nginx の使用を開始できます。
sudo service nginx start
システムが起動時する度に Nginx を実行する場合、Nginx を有効化します。
sudo systemctl enable nginx
ステップ 4: RTMP の構成
Nginx の動作設定は、/etc/nginx/nginx.conf
に存在します。
RTMP モジュールの構成を作成する場合、nginx.conf
ファイルに追加する必要があります。
以下は、ライブ・ストリーミングのサンプルになります。
#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } # RTMP configuration rtmp { server { listen 1935; # Standard port chunk_size 8192; # Application configuration application origin_ffmpeg_1 { live on; record off; meta copy; exec ffmpeg -i rtmp://localhost:1935/origin_ffmpeg_1/$name <parameters/libs/modules> rtmp://localhost:1935/live_ffmpeg_1/$name_1; } application live_ffmpeg_1 { live on; record off; } } }
nginx.conf
ファイル内で変更を施した後、Nginx を再起動して変更を適用します。
sudo systemctl restart nginx
これで、CentOS マシン上で Nginx のインストールと RTMP モジュールのチューニングができました。
ステップ 5: インテル® Media SDK のインストール
QuickSync で FFmpeg をビルドするため、インテル® Media SDK をインストールします。最初に、github からインテル® Media SDK をクローンします。
git clone https://github.com/Intel-Media-SDK/MediaSDK.git msdk
次に、クローンしたプロジェクトのディレクトリーに移動して、ビルドする必要があります。
cd msdk/ && mkdir build && cd build && cmake .. && make
msdk/build/__bin/release
でインテル® Media SDK をビルドした後、QuickSync で FFmpeg をビルドする際に必要となる libmfx.pc
ファイルが表示されます。インテル® Media SDK のフォルダーがある作業ディレクトリーへ戻り、libmfx.pc
ファイルとともに PKG_CONFIG_PATH
をフォルダーへエクスポートします。
export PKG_CONFIG_PATH=./msdk/build/__bin/release
ステップ 6: FFmpeg のインストール
まずは、github から FFmpeg プロジェクトをクローンします。
git clone https://github.com/FFmpeg/FFmpeg.git ffmpeg cd ffmpeg
FFmpeg をクローンする際、以下のオプションを使用して構成する必要があります。
./configure — enable-libmfx — enable-nonfree
構成に成功したら、ログで h264_qsv
オプションを確認できます。これは、FFmpeg が QuickSync で構成されたことを示します。これで、FFmpeg をコンパイルしてインストールできます。
sudo make && sudo make install
FFmpeg をインストールした後、FFmpeg にインストールされたコンポーネントを確認します。--enable-libmfx
は、QuickSync のインストールに成功したことを示します。
ステップ 7: インテル® Media Driver のインストール
使用するマシンにインテル® Media Driver (iHD_drv_video.so
) がインストールされていない場合、またはドライバーのバージョンが FFmpeg の実行に適していない場合、ドライバーをビルドする必要があります。まずは、github から Libva と GmmLib のマスターブランチをインストールする必要があります。
次に、github からインテル® Media Driver プロジェクトをクローンします。
git clone https://github.com/intel/media-driver.git
そして、ドライバーのフォルダーに移動して、ビルド用のフォルダーを作成し、コンパイルします。
cd media-driver && mkdir build && cd build/ && cmake .. && make
iHD_drv_video.so
ファイルを取得したら、LIBVA 環境変数を指定する必要があります。
export LIBVA_DRIVERS_PATH=/path/to/iHD_drv_video.so/ export LIBVA_DRIVERS_NAME=iHD
ステップ 8: Nginx を介した FFmpeg の起動
ここで、Nginx と FFmpeg を統合します。nginx.conf
ファイルを編集して、実行コマンドとして QuickSync と FFmpeg を使用します。以下のサンプルでは、トランスコーディング用のいくつかのパラメーターを追加し、FFmpeg のすべてのログを /home/tmp
へダンプします。ステップ 3 にある通り、Nginx は、tmp フォルダーの所有者およびグループになります。
rtmp { server { listen 1935; # Standard port chunk_size 8192; # Application configuration application origin_qsv_1 { live on; record off; meta copy; exec ffmpeg -hwaccel qsv -c:v h264_qsv -i rtmp://localhost:1935/origin_qsv_1/$name -map 0 -c:v h264_qsv -profile:v baseline -preset medium -b:v 1000K -f flv -c:a copy -f flv rtmp://localhost:1935/live_qsv_1/$name_1 2>>/home/tmp/ffmpeg_1; } application origin_qsv_2 { live on; record off; meta copy; exec ffmpeg -hwaccel qsv -c:v h264_qsv -i rtmp://localhost:1935/origin_qsv_2/$name -map 0 -c:v h264_qsv -profile:v baseline -preset medium -b:v 1000K -f flv -c:a copy -f flv rtmp://localhost:1935/live_qsv_2/$name_2 2>>/home/tmp/ffmpeg_2; } application live_qsv_1 { live on; record off; } application live_qsv_2 { live on; record off; } } }
保存して終了します。
次に、Nginx を使用してブロードキャストを起動します。トランスコードするストリームを選択し、開始します。
ffmpeg -re -i /path/to/stream/stream.mp4 -map 0 -c copy -f flv rtmp://localhost/origin_qsv_1/mystream
注意: 並列セッションの数と各セッションにおける出力数の両方を変更できます。出力を 1 つ追加する際のコード例は以下になります。
ffmpeg -re -i /path/to/stream/stream.mp4 -map 0 -c copy -f flv rtmp://localhost/origin_qsv_1/mystream -map 0 -c copy -f flv rtmp://localhost/origin_qsv_2/mystream
追記: ドライバーに問題がある場合、ステップ 7 を再度ご確認ください。ステップ 7 を既に確認済みであるにも関わらず問題が解決されない場合、nginx.conf
ファイルへ LIBVA_DRIVERS_PATH
を追加してください。iHD ドライバーが存在するディレクトリーからドライバーを使用するための権限が Nginx に付与されていることをご確認ください。
env LIBVA_DRIVERS_PATH=/path/to/iHD/driver;
ステップ 9: ブロードキャストにおけるトランスコードの動作確認
トランスコーディングを起動する前に、FFplay を実行し、どのような内容が出力されるのかを確認できます。これには、確認したい出力を選択して FFplay に追加する必要があります。例えば、1 つ目のアプリケーションから出力ストリームを確認する場合、以下のようなコードを実行できます。$name
変数の代わりに、FFmpeg を起動した際の出力ストリームに mystream
などの名前を付ける必要があります。
ffplay -v debug rtmp://localhost:1935/live_qsv_1in1_1/mystream_1_750
FFplay を開始した後、以下のような画面が表示されます。
これは、FFplay がデータを待機していることを示します。ステップ 7 で実行したように、ストリーミングを開始できます。
ffmpeg -re -i /path/to/stream/stream.mp4 -map 0 -c copy -f flv rtmp://localhost/origin_qsv_1/mystream
その後、問題がなければ、FFplay はトランスコードされたストリームの再生を開始します。
FFmpeg のログ (/home/tmp
) では、以下のような結果が表示されます。
これは、QuickSync と FFmpeg が正常に動作し、ブロードキャストの前にストリームをトランスコードしていることを意味します。
弊社では、ViCue Soft 社が提供する幅広い動画符号化方式に対応するビデオ解析ソフトウェア VQ Analyzer 製品や、Intel 社がオープンソースとして提供するインテル® Media SDK に対する有償サポートを販売しています。
VQ Analyzer がもたらす開発期間の短縮やコストの削減などの効果は、無償評価版にてお試しください。インテル® Media SDK の有償サポートに関する詳細は、FAQ ページの 「オープンソースのインテル® Media SDK 年間サポート販売開始」をご参照ください。
この記事は、ViCue Soft 社の Technology Blog に公開されている「How to install & tune Nginx with RTMP module and start streaming through FFmpeg with QuickSync on CentOS.」の日本語参考訳です。