明滅するプログラマの思索

WEBエンジニアとして勤務している一介の男が、日々気づいたことをまとめるブログです

HLS(HTTP Live Streaming) を構築する

HLS とは

  • Apple が開発した動画ストリーミングのためのロジックです。
  • 主にSmartphone向け、iPhone / Android3.0 以上で動作します。PCではデフォルトでは再生できませんが、Javascriptベースの再生可能なプレイヤーは開発されています。
  • 特別なサーバを必要とせず、Webサーバがあれば実装可能です。
  • 要はお手軽なストリーミングサーバ!

導入環境

ソフトウェア バージョン
CentOS 6.8
Apache 2.2.15

導入にあたって

必要なものは、動画をエンコードするためのコーデックと、セグメント化するためのツールです。
ここでは代表的なものをインストールしてみますが、配信動画の形式によっては別のコーデックが必要になるかもしれません。

開発ツールインストール

yum -y install autoconf automake make gcc gcc-c++ pkgconfig wget libtool zlib-devel
yum -y install --enablerepo=epel yasm

コーデックインストール

cd /usr/local/src/

git clone git://git.videolan.org/x264
cd x264/
./configure --enable-shared
make
make install
cd ../
git clone --depth 1 git://github.com/mstorsjo/fdk-aac.git
cd fdk-aac/
autoreconf -fiv
./configure
make
make install
# LAME MP3 エンコーダー(最新版持ってきてね)
tar zxf lame-x.xx.x.tar.gz
cd lame-x.xx.x/
./configure
make
make install
# AACエンコーダ(現時点での最新版は1.28)
wget http://downloads.sourceforge.net/faac/faac-x.xx.tar.gz
tar zxf faac-x.xx.tar.gz
cd faac-x.xx/
./configure
make
make install
# OpenCore適応的マルチ レート広帯域(AMR) (現時点での最新版は0.1.5)
tar zxf opencore-amr-x.x.x.tar.gz
cd opencore-amr-x.x.x/
./configure
make
make install
# Theora エンコーダー(現時点での最新版は1.1.1)
wget http://downloads.xiph.org/releases/theora/libtheora-x.x.x.tar.bz2
tar jxf libtheora-x.x.x.tar.bz2
cd libtheora-x.x.x/
./configure
make
make install
# OGG エンコーダー(現時点での最新版は1.3.2)
wget http://downloads.xiph.org/releases/ogg/libogg-x.x.x.tar.gz
tar zxf libogg-x.x.x.tar.gz
cd libogg-x.x.x/
./configure
make
make install

ffmpeg インストール

git clone git://source.ffmpeg.org/ffmpeg.git ffmpeg
cd ffmpeg/
./configure --prefix=/usr/local --extra-cflags='-march=native -mfpmath=sse -msse2' --optflags='-O2 -finline-functions' --disable-avisynth --enable-avfilter --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libx264 --enable-postproc --enable-pthreads --enable-shared --enable-swscale --enable-gpl --enable-nonfree --enable-version3
make -j2
make install

httpd.conf 設定

vi /etc/httpd/conf.d/hls.conf
# 以下を追記して新規作成
AddType application/x-mpegURL .m3u8
AddType video/MP2T            .ts

Apacheの再起動を行います。

動画プリセットファイルを作成

vi libx264-hls.ffpreset
# 以下を追記して新規作成
vprofile=main
coder=1
level=31
crf=22
qcomp=0.6
qmin=10
qmax=51
qdiff=4
i_qfactor=0.71
maxrate=14000k
bufsize=14000k
g=250
keyint_min=25
sc_threshold=40
me_method=umh
me_range=16
subq=6
refs=4
trellis=1
bf=16
b_strategy=1
partitions=+pi8x8+pi4x4+pp8x8+pb8x8
cmp=chroma
flags=+loop-global_header
deblock=0:0

配信する動画のフォーマットを確認する

ここでは、例として以下のような動画を想定することにします。

  • test.mp4
    • 640x360 25秒
    • 10秒ごとのセグメントファイルを作成する(25秒のため、セグメントファイルは3つとなる)

ffmpeg コマンドを利用してセグメントファイルを作成します。
そのとき、以下のオプションを使います。

オプション 説明
-i 元動画のファイル名を指定します
-segment_time セグメントファイル1つ当たりの秒数
-segment_list 配信時に使用するセットリストファイル。このファイル名で出力される
mkdir streamfiles
ffmpeg -i test.mp4 -threads 2 -codec:v libx264 -s:v 640:360 -aspect:v 16:9 -b:v 256k -fpre:v libx264-hls.ffpreset -acodec aac -strict experimental -ar:a 44100 -b:a 128k -ac:a 2 -map 0 -f segment -segment_format mpegts -segment_time 10 -segment_list stream.m3u8 streamfiles/stream%03d.ts
# 以下のファイルができる
stream.m3u8
streamfiles/stream000.ts
streamfiles/stream001.ts
streamfiles/stream002.ts

html 用意

<html>
<head>
<title>HLSで動画配信</title>
<link href="//vjs.zencdn.net/5.11/video-js.min.css" rel="stylesheet">
<script src="//vjs.zencdn.net/5.11/video.min.js"></script>
</head>
<body>
<video id="test" class="video-js vjs-default-skin" width="720" height="404" controls>
      <source src="stream.m3u8" type="application/x-mpegURL" />
    </video>
</body>
</html>

このHTMLに iPhoneAndroid 端末からアクセスすると、動画のストリーミング再生を確認できます。
冒頭にも書きましたが、PCからは再生できません。
PCからの再生には、video.js などを利用することになります。