動画生配信サーバーを作ってみた【前編】〈Debian 10,Nginx,FFmpeg,Red5〉
閉じる
閉じる

新しい記事を投稿しました。シェアして読者に伝えましょう

×

動画生配信サーバーを作ってみた【前編】〈Debian 10,Nginx,FFmpeg,Red5〉

2019-11-14 20:30

    動画生配信サーバー作るためにLinuxをセットアップします

    ---- SKA’s blomaga written on 2019/08/14 edited on 2019/11/14 ----

    はいみなさんこんにちは。SKA’s blomagaへようこそ。
    前回からえらく時間が空いてしまって申し訳ありません。当初予定していたnginx-rtmp-moduleを使った生配信では配信終了できない問題(XSplitで配信終了してもRTMPが閉じない問題)が起きたため,試行錯誤していたら時間が経ってしまいました(←だとしても1か月前には投稿できていた)。
    てことで今日はですね,「お盆休みの自由研究」と題した自宅鯖&Webアプリ開発日記の続きです。今回のテーマは「Debian 10をインストールしてNginxとFFmpegで動画・生配信サーバーをセットアップしよう前編」(次回は前回作ったプレイヤーで再生してみよう)って感じで,Linuxをセットアップしていきます。本当は最後までを1つの記事にする予定でしたが,目的は同じでもやることはかなり違うので分けました(前編の分は8月中に作業終わってました。さっさと投稿すればよかったですね)。

    概要

    • Debian 10(GNU/Linux)をインストールします
    • サーバー向けにセットアップをしていきます
    • Nginx(Webサーバー)を rtmp-module込みで ビルドします
    • FFmpeg(マルチメディアフレームワーク)をビルドします
    • Red5(RTMPサーバー)をインストールします
    • Nginxのセットアップをします(次回)
    • Red5のセットアップをします(次回)
    • 試験放送してみます(次回)

     前回の最後に書いたとおり,今回は詳しいやり方まで書きません。こうやったという流れと,詰みポイントをメインに書いていきます。対象はやや上級者向けになりますが,ご了承ください。

     とはいっても,Linux系一切触ったことない人だと↑が異世界語にしか見えないかもしれないのでほんとに軽く説明しておきます。

    • Debian:いわゆるLinux系と呼ばれるフリーのOS(ディストリビューション)です。
    • Nginx:フリーでオープンソースなWebサーバーアプリです。
    • ビルド:ソース(プログラミング言語)から機械語に翻訳し,コンピューターで実行できるようにすることです。
    • FFmpeg:コマンドラインで使える万能なマルチメディアの編集・変換ソフトです。
    • Red5:RTMP(Flashを使ってリアルタイムに映像やテキストをやりとりするプロトコル)のサーバーです。

     ちなみに,配信方式としては

    1. 当サーバーはRed5がRTMPを待ち受ける。
    2. 配信者はXSplit BroadcasterやOBS StudioからRTMPで当サーバーに配信する。
    3. Red5は動画を受信したらFFmpegを呼び出す。
    4. FFmpegはHLS(HTTP Live Streaming)方式に分割・変換し,Nginxの領域に配置する。
    5. NginxはHTTPを待ち受ける。
    6. 視聴者はブラウザーから当サーバーに動画を要求する。
    7. Nginxは動画を返す。



    という感じになります。
    それでは作業していきます。

    Debian 10のインストール

    ※ 普段使わないPCにインストールする前提で進めます。デュアルブート(普段使ってるWindowsやmacを残したままLinuxもインストール)にする場合,機種や操作によっては元のOSが消える可能性がありますので,ご注意ください。普段使うPCにインストールしたい場合,VirtualBoxやVMware等の仮想環境をオススメします。なお,2019年現在,Windows Subsystem for Linuxでは今回やることができませんので別の方法でお願いします(今後変わる可能性はあります)。

     今回は先月(2019年7月)にリリースされたばかりのDebian 10でサーバーを構築していきます。Ubuntuでも全く問題ありませんが,Ubuntuは標準のままある程度使えるようになっている代わりに,逆に標準で付いてくるソフトがカスタマイズされてて分かりづらいので,私はUbuntuのもとになっているDebianの方が好きです。あと,私はGUI信者なのでデスクトップ環境GNOMEを入れますが,コマンドラインの方が好きな方はコマンドラインでどうぞ。

    それでは準備はできましたか? 始めていきます。

     まず,Debianのサイトのダウンロードページ(https://www.debian.org/distrib/netinst)からインストールディスクをダウンロードします。インストールのCPUに合わせてamd64,arm64,……などを選んでください。PCで一般的なIntel系のCPUならamd64です。

     次に,ダウンロードしたインストールディスクをUSBメモリーやDVDに書き込みます。ISOイメージなのでDVDの場合特に問題ないと思います。USBメモリーに書き込む場合,Windowsの場合Win32DiskImagerがオススメです。macの人はWeb検索すれば出ると思うので頑張ってください。

     その次に,USBメモリーなりDVDなりからDebianインストーラーを起動(ブート)します。そこに関してはPCの機種によって違うので自分で調べてください。ちなみに私はMac miniに入れました。Macの場合は起動時にcommand+optionを押します。

     Debianインストーラーが起動できれば後は画面の指示に従っていけば,迷うことなくインストールできると思います。まあ,インストール先のディスクに関する部分はある程度知識がないと理解できないと思いますが,そこは申し訳ありませんが,他サイトで勉強してきてください(もちろん,自動でいい感じにやってくれるオプションもあります)。

     最後の方で,デスクトップ環境が選べます。私はGNOME 3にしましたが,お好みのデスクトップ環境を選んでください(もちろんデスクトップなしでコマンドラインオンリーでも構いません)。個人的にはGNOME 3が一番見やすいかなと思います(macに近いところも多いし)。

    ていう感じで,インストールできましたよね?

    Debianのセットアップ

     先程も言いましたが,Ubuntuは初期装備でもある程度使えますが,Debianはわりと初期装備少なめです。なので,必要なものや,趣味のものを入れてしまいましょう。

     まず,最初にDebianインストール時に作成したアカウントをsudoers(管理者権限コマンド実行可能アカウント)にします。
    ターミナルで「su -」と入力し,root(管理者アカウント)でログインします。そして「visudo」コマンドで作成したアカウントをsudo可能にしてください。「sudoの権限を設定するvisudoコマンド【Linuxコマンド集】 - エンジニアの入り口」とかを参考にすると良いです。

     それではいろいろとセットアップ・インストールしていきます。特筆しないものに関してはターミナルで「sudo apt install ほげほげ」と入力することでインストールできます。プロキシー環境の方は以下のプロキシー設定をした後にインストール時は「sudo -E apt install ほげほげ」とsudoコマンドに-Eと引数を付けてください(-Eは環境変数を読み込んでくれるオプションです)。
    また,最近のDebianではapt-getではなくapt推奨なので,ググる・ヤフるときは適宜置き換えてください。
    ちなみにaptでインストールできるかだったり名前だったりは「Debian -- Packages」を使うと便利です。
    私は以下のような感じで設定しました。先程の「ほげほげ」に下の( )内の名前を入れてください。

    • (プロキシー環境の場合)プロキシーの設定
      基本的には環境変数「https_proxy」と「http_proxy」だけ設定すれば良いと思いますが,うまく行かない場合は
      社内Proxyに阻まれていろいろ捗らない人のためのTips - Qiitaとかを参考にいろいろやってみてください。
    • Vim (vim)
      コマンドラインで使うテキストエディターです。
    • UFW (ufw)
      ファイアウォール(パケットフィルタリング)です。インストール後「sudo systemctl enable ufw」と「sudo systemctl restart ufw」と「sudo ufw enable」で有効化してください。今回使用する内向きのTCP 80,443,1935番ポートは開く設定にしてください。いつかufwの使い方記事も書きます。
    • Mozc (ibus-mozc)
      Google発オープンソースの日本語入力(漢字変換)です。
      JISキーボードを使っている場合「ibus-mozcのキーボードレイアウトが英語になるトラブルの対処法 - クロの思考ノート」を参考に設定してください。
    • 各種日本語フォント
      • M+ 1P (fonts-mplus)
      • Noto Sans CJK JP (fonts-noto-cjk)
      • IPAゴシック (fonts-ipafont)
      • モトヤシーダ (fonts-motoya-l-cedar)
      あたりから好きなフォントをインストールすればいいと思います。私はかの有名なフリーフォントM+ 1Pを標準にしました。標準フォントはGNOME環境の場合「GNOME Tweaks」で変更できます(日本語使う人は変更推奨)。Noto Sans CJKはGoogleとAdobeが作ったフリーとは思えないクオリティーのフォントで現在の純正Androidの標準フォント。IPAは名前のとおりセキュリティーや情報処理技術者試験でお世話になる某独立行政法人とタイプバンクさんのフォント。特に特徴はない。モトヤは漢検のフォントも担当している大阪の印刷会社で,モトヤシーダは地図マピオンやAndroid 4で採用されています。「永遠に伝えたい、美しく格調高いモトヤ書体。」 わりと好き。あ,すみません,箇条書きの中なのにフォントについて熱く語ってしまいました。
    • (GNOMEの場合) Dash to Dock
      GNOME 3のShell extensions(拡張機能)です。背景画像以外何もないデスクトップにドックを追加します。
      aptではなく,Firefoxに拡張機能GNOME Shell integrationを入れ,そこからインストールします。プロキシー環境の方は詰みます。
    • htop (htop)
      システムモニタリングツールです。
    • fancontrol (fancontrol)
      PCのファン制御をします。機種によってはファン制御をOSに任せるので,Linuxを入れてから負荷によらずファン速度が一定になる場合は自己責任で入れてみてください(失敗すると最悪オーバーヒートします)。使い方はこちら(Ubuntu PWMファン制御 その1 - 概要とインストール・設定ファイルを作成する - kledgeb)とかどうでしょうか(他人任せ)。
    • NTP (ntp)
      時刻サーバーと同期します。こちらもインストール後「sudo systemctl enable ntp」で有効化させましょう。ネットワーク管理の厳しい環境の方は設定ファイル「/etc/ntp.conf」を書き換えて適宜NTPサーバーの指定とかしましょう。
    • (Debianインストール時にやっていない場合)swap領域の作成
    • FileZilla (filezilla)
      GUIでSFTPが使えます。普通にサーバー専用機にする場合は入れなくていいです。
    • cURL (curl)
      何かで必要になったはずですが忘れました。まあ今後いろいろと必要な場面が出てくるので入れておいて損はないです。
    • rsync (rsync)
      ファイルを同期します。ユーザーのディレクトリーで編集したWebページをサーバーに配置する際に使います。
    • リモートデスクトップする場合,好きなVNCサーバーを入れてください(執筆時点でWayland対応のVNCサーバーが見つからなかったので難しいかもしれません)。← ここらの問題についてはまたいつか記事にしたいと思います。

     ここで一旦Q憩(好きなもの入れてね)。
    私は「ls=ls -l --color=auto」のエイリアスを~/.bash_rcに書いて,Audacity,GIMPといった定番ソフト,Blender,Shotcutも趣味で入れました(最後2つは絶対使わないと思う)。そして,GIMPで背景画像用に画像加工して,好きな背景画像をセットしました。

    Nginx とrtmp-module をビルドします

     まずは引き続きNginx とrtmp-module に必要なものをインストールしていきます。以下すべて「sudo apt install ほげほげ」というコマンドで入れていきます。下に( )がないものは そのまま入れてください。

    • Git (git)
    • GCC (gcc)
    • OpenSSL (openssl)
      ※ 入ってたのでおそらく入れる必要なし
    • libpcre3-dev
    • libssl-dev
    • zlib1g-dev
    • build-essential

     次に,Nginx とrtmp-module をダウンロードし,ビルドしていきます。
    またまた他人任せですが,「nginxでストリーミングサーバを立ててライブ配信する。 - Qiita」の「インストール・設定」の項目を参考に作業していくとNginxがインストールできます。

     その次に,Nginx公式サイトの「NGINX systemd service file | NGINX」を参考に,テキストエディターで「/lib/systemd/system/nginx.service」というファイルを作り,リンク先に書いてある内容をコピーして保存してください。
    いちおうGNOME環境の初心者向けに言うなら「sudo -E gedit /lib/systemd/system/nginx.service」というコマンドを打てばいいと思います。
    自分もはまってしまいましたが,「systemd」の中にさらに「system」があるので間違えないようにしましょう。

    FFmpegをビルドします

     基本的に公式Wikiの通りにコマンドを打てば今回の用途としては問題ありません。ただし,さきほど書いたように「apt-get」は「apt」に置き換えてください。いちおう全く英語が読めない人に向けて補足するなら,まずWikiのTipにも書いてありますが,「make」コマンドは引数-jを付けて「make -j4」のように置き換えてください(数値はCPUのコア数にするのがオススメ ←分からなければ数値なしでもおk)。次に各項目(モジュール)の「sudo apt」で始まる1行のものか「cd ~/」で始まる複数行のコマンドはどちらか片方を選択して実行してください。見れば分かると思いますが,1行の方はaptからインストールし,複数行の方はそれぞれのモジュールも自分でビルドします。

     Wikiのとおりに作業すると,ユーザー領域にビルドしたFFmpegが置かれるので,他のユーザーからも使えるようにシンボリックリンク(ショートカットのようなもの)を作ります。次のような感じでコマンドを打ちます。
    ※ 「現在のディレクトリー $ 入力コマンド」の形式で記載しています。

    $ cd ~/bin/
    ~/bin $ sudo ln -s ./ffmpeg /usr/local/bin/ffmpeg
    ~/bin $ sudo ln -s ./ffplay /usr/local/bin/ffplay
    ~/bin $ sudo ln -s ./ffprobe /usr/local/bin/ffprobe

    Red5をインストールします

     Red5はJavaで書かれているので,まずはJDKが必要となります。お好きなJDKをインストールしてください(Javaには詳しくないので割愛します ググるなり ヤフるなり ビンるなり Siriるなり Alexaるなり してください)。

     次にRed5をダウンロードします。ターミナル(端末アプリ)を起動し,次のような感じで行いました。

    ~ $ mkdir ./temp-red5
    ~ $ cd ./temp-red5/
    ~/temp-red5 $ wget https://github.com/Red5/red5-server/releases/download/vx.x.x/red5-server-x.x.x.tar.gz
      yyyy-mm-dd hh:mm:ss (1.35 MB/s) - ‘red5-server-x.x.x.tar.gz’ saved [49082226/49082226]
    ~/temp-red5 $ tar -zxf ./red5-server-x.x.x.tar.gz
    ~/temp-red5 $ sudo mv ./red5-server /usr/local/
    ~/temp-red5 $ cd /usr/local/red5-server/
    /usr/local/red5-server $ sudo chown root:root ./*
    /usr/local/red5-server $ sudo ./red5.sh
    • Red5のバージョン(red5-server-の後など)はx.x.xに置き換えています。適宜最新版のバージョンに置き換えてからコマンド実行してください。というか,GitHubのReleasesを見て,wgetの後のURIはコピペすればいいと思います。その後のファイル名もTabキー押してシェルの補完機能使えばいいと思います。
    • 日付・時刻等もyy (ryに置き換えています。
    • 所有者をrootに変えていますが,私もLinuxやサーバー周りの経験は浅いので,賛否等あればコメントくれるとありがたいです。

    動作確認

     まだ設定等はしていませんが,インストールが完了したということで,とりあえず動作確認してみましょう。

    1.Nginx

     次のようにコマンドを打って,Nginxを開始し,状態を確認します。

    ~ $ sudo systemctl restart nginx
    ~ $ sudo systemctl status nginx/

    結果が次のようにactive (running)と出れば問題ありません。

     nginx.service - The NGINX HTTP and reverse proxy server
    Loaded: loaded (/lib/systemd/system/nginx.service; disabled; vendor preset: enabled)
    Active: active (running) since xxxx

    まだちゃんと設定してないので動作確認が終わり次第「sudo systemctl stop nginx」でNginxを止めてください。

    2.FFmpeg

     ffmpegとコマンドを打って,次のような感じのメッセージが出れば問題ありません(↓は違うビルドの物なので細かいところは変わってくると思います)。

    ~ $ ffmpeg
    ffmpeg version x.x.x Copyright (c) 2000-2019 the FFmpeg developers
    built with Apple LLVM version 10.0.1 (clang-1001.0.46.4)
    configuration: --prefix=/usr/local/Cellar/ffmpeg/x.x.x --enable-shared --enable-pthreads --enable-version3 --enable-avresample --cc=clang --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libmp3lame --enable-libopus --enable-librubberband --enable-libsnappy --enable-libtesseract --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librtmp --enable-libspeex --enable-videotoolbox --disable-libjack --disable-indev=jack --enable-libaom --enable-libsoxr
    libavutil 56. 22.100 / 56. 22.100
    libavcodec 58. 35.100 / 58. 35.100
    libavformat 58. 20.100 / 58. 20.100
    libavdevice 58. 5.100 / 58. 5.100
    libavfilter 7. 40.101 / 7. 40.101
    libavresample 4. 0. 0 / 4. 0. 0
    libswscale 5. 3.100 / 5. 3.100
    libswresample 3. 3.100 / 3. 3.100
    libpostproc 55. 3.100 / 55. 3.100
    Hyper fast Audio and Video encoder
    usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...

    3.Red5

    ~ $ cd /usr/local/red5-server/
    /usr/local/red5-server $ sudo ./red5.sh

    とコマンドを打って,ここに書ききれないくらい大量に文字が出てくれば問題ないと思います(?) 

    Q&A

    Q1:ニコ生とかYouTube Liveでよくない?

    A1:大抵の人はニコニコやつべでいいと思います。ただ,今回はあくまで趣味なのでダメです。あとはネットワークが厳しくて,RTMPがブロックされてる環境だったり,ネット上に公開できないコンテンツを特定少数に見せたいとか,そういうときにも使えると思います。あとはニコ厨だったりして,どうやって映像が流れてくるんだろうかって知りたくなった人とかも,実際に自分で配信サービスを立ててみるっていうのは理解の助けになると思います。


    -------- SKA’s blomaga --------

     はいということで,前回のクライアント側とは逆にサーバー側をセットアップしていこう(前編)ということでしたが,どうだったでしょうか。次回はNginxの設定ファイルを書いたり,FFmpegを使ってコマンドラインで動画の変換をしてみたり,Javaでプログラミングしたりします。お楽しみに。ではまた!

    今日のリンク と 参考文献

    • お盆休みの自由研究その0「お盆休みの自由研究と題して自宅鯖&Webアプリ構築するお(2019)」:ar1798085
    • お盆休みの自由研究その1「hls.jsでお手軽 動画・生配信視聴プレイヤー作ってみた」:ar1798847
    • SKAのニコニコ動画
    • SKAのTwitter
    • 宣伝:最近の動画です。
    • 各種参考文献は本文中にあります。
    広告
    コメントを書く
    コメントをするには、
    ログインして下さい。