自前サーバで HTTP Live Streaming 配信をする
こんにちは。 Signal compose の leico です。今回はゴールデンウィークに家に引きこもって楽しめる内容ということで、 VPS 全盛の昨今に自前の実機サーバでリアルタイム配信をしてみようという記事です。
Webサーバの構築や設定、運用、負荷分散などに関しては他のWebリソースを参考にしてもらい、この記事では Linux で Webカメラの情報から HTTP Live Streaming の動画をリアルタイムで出力していくことを中心に書いていきます。
HTTP Live Streaming とは
詳しい内容は上記にゆずってざっくりと説明すると、 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
などなど、詳しくはこちらにまとめてあります。
Webカメラから動画を取得してHLSで書き出す
前のセクションでは接続されている Web カメラの情報を取得しました。無事に情報を取得できているのであれば、それは Web カメラがちゃんと接続できていることも同時に証明しています。厄介な接続系の問題は解決できたことになるのです。
残すはソフトウェア的な問題、すなわち動画を取得してHLSとして出力することだけです。その部分には、 avconv というソフトウェアを利用します。
このソフトウェアのインストールはソースからコンパイルします。コンパイルに必要なライブラリなど、詳細はこちらです。
同様に、 avconv の詳細な仕様などもこちらで調べてまとめてみました。
では、実際に 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 カメラ同様、取り込む際のフォーマットの確認が必要です。確認方法などをまた以下にまとめてあります。
ここで取得した情報を avconv で利用する方法は、こちらです。
音声付きで 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://[サーバのIPアドレス]
で表示されると思います。駆け足でしたがここまででリアルタイム配信の環境ができました。
配信を長く続ける
ずっと配信をしていると ts ファイルが膨大になってきたり、あるいはターミナルを閉じて終了してしまうといった事故が発生し始めます。長く安定して動作させるための設定やソフトウェアについて、以下にまとめてあります。
ご依頼/相談/お問い合わせ
シグナル・コンポーズでは音楽制作、Max/Max for Liveデバイス制作など、各種テクニカルなコンサルティングやディレクション、R&D、プロトタイピング、制作などお受けしています。何かあればお気軽に `info[at]signalcompose.com` にお問い合わせください。よろしくお願いします。会社概要等は以下のサイトをご覧ください。
また、昨年はこんなアルバムのリリースもしています。
次のM3(3月)にも参加の予定です。音楽系のポートフォリオも以下で纏めてありますので、ぜひご覧ください。音楽制作は広くやっていきますのでお気軽にご連絡ください。
この記事が気に入ったらサポートをしてみませんか?