Raspberry Pi3で動画配信サーバーを構築してみた

Raspberry Pi3で「FFmpeg」と「Nginx」を利用して、動画サーバーを構築してみました。FFmpegはクラスプラットフォーム(Windows/Mac/Linux)で動作するオープンソースの動画/音楽ファイル変換ツールです。ここではRaspberry Pi3における動画配信サーバーの構築について解説していきます。

01: インストール

FFmpeg

bash


# FFmpegのダウンロード
$ git clone https://github.com/FFmpeg/FFmpeg.git

# 移動
$ cd FFmpeg

# タグを確認
$ git tag -l

# 最新のバージョンをチェックアウト
$ git checkout refs/tags/n3.3.1

# Makefileを作成
$ ./configure --enable-gpl --enable-omx --enable-omx-rpi --enable-nonfree

# ビルド
$ make -j 4

# インストール
$ sudo make install

Nginx

bash


# Nginxに必要なパッケージのインストール
$ sudo apt-get install libpcre3-dev libssl-dev

# Nginxのダウンロード
$ wget https://nginx.org/download/nginx-1.13.0.tar.gz 

# ダウンロードしたファイルを展開
$ tar zxvf nginx-1.13.0.tar.gz

# リアルタイム配信用のモジュールをダウンロード
$ git clone https://github.com/arut/nginx-rtmp-module.git

# Makefileを作成
$ cd nginx-1.13.0
$ ./configure --with-http_ssl_module --add-module=../nginx-rtmp-module

# ビルド
$ make -j 4

# インストール
$ sudo make install

# 設定ファイルの編集
$ sudo nano nginx.conf

# 起動
$ sudo /usr/local/nginx/sbin/nginx

nginx.conf


...
        location /stat {
            rtmp_stat all;
            rtmp_stat_stylesheet stat.xsl;
        }
        location /stat.xsl {
            root /usr/local/src/nginx-rtmp-module;
        }

        location /control {
            rtmp_control all;
        }
...
rtmp {
    server {
        listen 1935;
        ping 30s;
        notify_method get;
        application video {
            live on; 
        }
    }
}

NginxとApacheを共存させる場合は下記リンク先を参照して下さい。

Raspberry Pi3でNginxとApacheを共存させてみた

02: 動作テスト

VLCプレイヤーで確認

下記コマンドを実行して、VLCプレイヤーで「rtmp://192.168.11.20/video/sample」にアクセスする。
「ファイル」→「ネットワークを開く」を選択する。 URL欄に「rtmp://192.168.11.20/video/sample」を入力して開く。

bash


# リアルタイム配信を開始
$ while [ 1 ]; do ffmpeg -re -i sm22037570.mkv -c:v h264_omx -c:a aac -r 30 -s 720x406 -b:v 1000k -f flv rtmp://192.168.11.20/video/hoge; done

ブラウザで確認

bash


# 移動
$ cd /var/www/html/

# tsファイルを作成
$ ffmpeg -fflags +discardcorrupt -i sample.mkv -bsf:a aac_adtstoasc -c:a copy -b:v 5000k -c:v h264_omx -y sample.mp4
$ ffmpeg -i sample.mp4 -codec copy -map 0 -f segment -vbsf h264_mp4toannexb -segment_format mpegts -segment_time 10 -segment_list sample.m3u8 sample-%03d.ts

# HTMLファイルを作成
$ sudo nano sample.html

sample.html


<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no">
    <title>HTTP Live Streaming Test</title>
  </head>
  <body>
    <header>
      <h1>HTTP Live Streaming Test</h1>
    </header>
    <div>
      <video width="1280" height="720" src="stream.m3u8" preload="none" onclick="this.play()" controls />
    </div>
  </body>
</html>

03: サービスの自動起動

bash


# Unit定義ファイルを作成
$ sudo nano /lib/systemd/system/nginx.service

# Unit定義ファイルを変更した時に、変更内容をsystemdに認識させる。
$ sudo systemctl daemon-reload

# サービスの起動
$ sudo systemctl start nginx.service

# サービスの実行状態を表示
$ sudo systemctl status nginx.service

# サービスの自動起動を設定
$ sudo systemctl enable nginx.service

nginx.service


[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target