自前サーバで HTTP Live Streaming 配信をする

こんにちは。 Signal compose の leico です。今回はゴールデンウィークに家に引きこもって楽しめる内容ということで、 VPS 全盛の昨今に自前の実機サーバでリアルタイム配信をしてみようという記事です。

Web サーバの構築や設定、運用、負荷分散などに関しては他の Web リソースを参考にしてもらい、この記事では Linux で Webカメラの情報から HTTP Live Streaming の動画をリアルタイムで出力していくことを中心に書いていきます。

HTTP Live Streaming とは

HTTP Live Streaming | Apple Developper Documentation:
https://developer.apple.com/documentation/http_live_streaming

HLS仕様書 日本語訳 [ WWDC-2017-Preliminary 前半] | | Gnzo Labo:
https://gnzo.com/labo/archives/646

詳しい内容は上記にゆずってざっくりと説明すると、 HTTP Live Streaming (以下HLS) とは HTTP プロトコルで動画配信をするための規格です。この規格の利点はリアルタイム配信が可能であることと、各回線の帯域に合わせて適切なビットレートの動画を提供できることです。

これらの機能は、定期的に更新されるプレイリストと、そのプレイリストに追従して更新されてゆく、帯域に合ったビットレートの、細切れになった動画ファイルを順番に読み込んでいくことで実現しています。

Linux で Web カメラの情報を取得する

まずは Linux で Web カメラから動画のフォーマット情報を取り出さなければなりません。
それには video4linux2 というソフトウェアを利用します。
このソフトウェアのユーティリティで、Webカメラが出力できる解像度や FPS といった情報を取得します。
ユーティリティ他のインストールは、 debian 系の場合

$ sudo apt install v4l2-util

で行います。以下各種情報を取得する例です。

デバイス一覧取得

$ v4l2-ctl --list-devices

ビデオデバイスの全情報取得

$ v4l2-ctl -d /dev/video0 --all

ビデオデバイスがサポートする動画フォーマットの一覧を取得する

$ v4l2-ctl -d /dev/video1 --list-formats-ext

などなど、詳しくはこちらにまとめてあります。

Linux: 利用できるWebカメラの情報を取得する:
https://leico.github.io/TechnicalNote/Linux/webcam-usage

Webカメラから動画を取得してHLSで書き出す

前のセクションでは接続されている Web カメラの情報を取得しました。無事に情報を取得できているのであれば、それは Web カメラがちゃんと接続できていることも同時に証明しています。厄介な接続系の問題は解決できたことになるのです。

残すはソフトウェア的な問題、すなわち動画を取得してHLSとして出力することだけです。その部分には、 avconv というソフトウェアを利用します。
このソフトウェアのインストールはソースからコンパイルします。コンパイルに必要なライブラリなど、詳細はこちらです。

Linux: avconvをlibx264、libx265、alsaを利用できるようにしてビルドする:
https://leico.github.io/TechnicalNote/Linux/avconv

同様に、 avconv の詳細な仕様などもこちらで調べてまとめてみました。
avconvの使い方:https://leico.github.io/TechnicalNote/Linux/avconv-usage

では、実際に Web カメラから動画を取得して HLS として出力してみましょう。取得するフォーマットを

  • 取得対象 :/dev/video0
  • 解像度 :720p
  • フレームレート :30fps
  • ビットレート :512kbps

と仮定します。コマンドは

$ avconv -f video4linux2 -video_size 1280x720 -framerate 30 -i /dev/video0 \
-vcodec libx264 -preset veryfast -b:v 512000 \
-f hls -hls_list_size 10 -hls_time 10 ~/out.m3u8

このようになります。

ビルド時に ALSA のインストールをしていますが、まだ音の取り込みはしていません。次のセクションで音を取り込むために、マイクの情報を取得してみましょう。

ALSA で音声機器の情報を取得する

音声は映像と別の方法で取り込む必要があります。音声を取り扱うためのソフトウェアとして ALSA というものがあります。
これも Web カメラ同様、取り込む際のフォーマットの確認が必要です。確認方法などをまた以下にまとめてあります。

Linux: 利用できるオーディオデバイスの情報を取得する:https://leico.github.io/TechnicalNote/Linux/alsa-usage

ここで取得した情報を avconv で利用する方法は、こちらです。

avconvでのALSAデバイス指定方法:https://leico.github.io/TechnicalNote/Linux/avconv-alsa

音声付きで HLS 動画配信をおこなう

では音声付きで動画配信をしてみましょう。フォーマットは以下のように仮定します。

  • 映像取得対象 :/dev/video0
  • 解像度 :720p
  • フレームレート :30fps
  • 映像ビットレート :512kbps
  • 音声取得対象 :1番目0番
  • 音声フォーマット :AAC
  • 音声ビットレート :256kbps

これで配信するコマンドはこのような感じになります。

$ avconv -f video4linux2 -video_size 1280x720 -framerate 30 -i /dev/video0 \
-f alsa -ac 2 -ar 44100 -i hw:1,0 \
-vcodec libx264 -preset veryfast -b:v 512000 \
-acodec libfdk_aac -b:a 256000 -ar 44100 \
-f hls -hls_list_size 10 -hls_time 10 ~/out.m3u8

このコマンドを実行すると、うまくいけばホームディレクトリ以下に大量の ts ファイルが出力されてきます。しかしそれでは Web ブラウザなどで見ることができません。 Web に公開するように書き換えてみます。

Web に公開しているディレクトリを /var/www/html 、かつ書き込みに管理者権限が必要であると想定して、以下のようにコマンドを変更しました。

$ sudo avconv -f video4linux2 -video_size 1280x720 -framerate 30 -i /dev/video0 \
-f alsa -ac 2 -ar 44100 -i hw:1,0 \
-vcodec libx264 -preset veryfast -b:v 512000 \
-acodec libfdk_aac -b:a 256000 -ar 44100 \
-f hls -hls_list_size 10 -hls_time 10 /var/www/html/out.m3u8

こんな簡単な index.html を /var/www/html/ に置いて、アクセスしてみましょう。

<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<video src="out.m3u8" controls></video>
</body>
</html>

Web サーバ /HLS の配信をしているのと同じコンピュータのブラウザであれば

http://localhost

でページと再生ウィンドウが、うまくいっていれば表示されると思います。ローカルの他のコンピュータやスマートフォンのブラウザを使うのであれば

http://[サーバのIPアドレス]

で表示されると思います。駆け足でしたがここまででリアルタイム配信の環境ができました。

配信を長く続ける

ずっと配信をしていると ts ファイルが膨大になってきたり、あるいはターミナルを閉じて終了してしまうといった事故が発生し始めます。長く安定して動作させるための設定やソフトウェアについて、以下にまとめてあります。

hls 配信で生成され続ける動画ファイルを定期的に削除する:
https://leico.github.io/TechnicalNote/Linux/hls_cron

配信しているコマンドが、 ssh 脱出後でも動作し続けるようにする:
https://leico.github.io/TechnicalNote/Linux/disown_nohup

ご依頼/相談/お問い合わせ

シグナル・コンポーズでは音楽制作、Max/Max for Liveデバイス制作など、各種テクニカルなコンサルティングやディレクション、R&D、プロトタイピング、制作などお受けしています。何かあればお気軽にお問い合わせください。お待ちしております!

  

執筆:大石 桂誉

関連記事

前の記事へ

MacBook Proをクラムシェルにした時iPhoneをウェブカムの代わりにして使うには?と、あと少しのTips

次の記事へ

Music Transformerを動かしてみる