RTMP モジュールを使用した Nginx のインストールとチューニングおよび CentOS での FFmpeg を介したストリーミングの開始方法

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 から LibvaGmmLib のマスターブランチをインストールする必要があります。

次に、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.」の日本語参考訳です。

タイトルとURLをコピーしました