どこでも見れるメモ帳

とあるSEの備忘録。何かあれば気軽にコメントください〜

自鯖でストリーミング再生

やりたいこと

自鯖にある各種動画ファイルをストリーミング再生できるようにします.

方法

今回は,ストリーミング再生をHTML5によるvideoタグを用いて実現します.
詳しくは,こちらのサイト(http://www.html5rocks.com/ja/tutorials/video/basics/)にありますように,
apacheにおけるMIMEタイプの設定するだけで出来るので,すぐに効果が得られます.

ただし,この方法では,ストリーミング再生できるフォーマットに限りがありますので,動画ファイル自体のエンコードで対応する必要があります.
ここでは,圧縮形式でよく利用されるmp4(avc+aac)にエンコードします.

この方法を採る理由

ストリーミング再生する方法は多くありますが,あえて今回上記の方法を採るのは,

  • 自鯖に既にapache/webdavを導入しており,簡単に導入できそう
  • 自鯖のスペックが糞(atom)なので,クライアントから再生する際にリアルタイムにトランスコードできない

という理由からです.
主に2つ目の理由が大きいです.

今回の方法では,サーバはクライアントに対して単純にデータを流すだけで良い,つまり計算能力が必要ないので,
サーバの負荷が小さい点がメリットと言えそうです.*1

やったこと

大まかな流れ

以下,すべてサーバ側の設定となります.

  • apacheの設定
    • 拡張子がmp4のファイルに対して,video/mp4のMIMEタイプを設定する
  • 動画ファイルをブラウザで直接再生できる形式にffmpegを用いて変換
    • すべての動画がMP4(avc+aac)になるようにエンコードする
    • なるべく劣化を抑えてコンテナ変換する
apacheの設定

httpd.confを開いて

[root@centos ~]# vim /etc/httpd/conf/httpd.conf

以下のようにvideo/mp4をAddTypeします.
詳しくはこちらのサイト(http://www.adminweb.jp/apache/docroot/index4.html)を参考にさせて頂きました.

#
# AddType allows you to add to or override the MIME configuration
# file mime.types for specific file types.
#
#AddType application/x-tar .tgz
<FilesMatch "\.mp4$">
  AddType video/mp4 .mp4
</FilesMatch>

httpdを再起動することを忘れずに.

[root@centos ~]# service httpd restart

これでmp4ファイル(avc+aac)に対してブラウザからapache経由でアクセスすると,ブラウザで再生できるようになります.

動画ファイルのエンコード

今回の方法で再生できるフォーマットはmp4(avc+aac)のみです.
コンテナが同じでも,コーデックの組み合わせが異なれば再生出来ません.*2
なので,すべてのファイルをmp4(avc+aac)にしておく必要があります.

しかし,一般に,エンコードはすればするほど品質が劣化してしまいます.
そこで,なるべくエンコードせずにフォーマットを揃えるようにします.
つまり,非多重化*3してから,エンコードが必要な場合のみエンコードしmp4に多重化*4します.

以下,4つのパターンに分類してスクリプトを作成します.

# 映像・音声コーデックが同じでコンテナが異なる場合(例えばflv(avc+aac))
$ ffmpeg -i input.flv -acodec copy -vcodec copy output.mp4

# 映像コーデックが同じで音声コーデックが異なる場合(例えばmp4(avc+mp3))
$ ffmpeg -i input.mp4 -acodec libvo_aacenc -vcodec copy output.mp4

# 映像コーデックが異なり音声コーデックが同じ場合(例えばavi(vp6+aac))
$ ffmpeg -i input.avi -acodec copy -vcodec libx264 output.mp4

# 映像・音声コーデックが異なる場合(例えばavi(xvid+mp3))
$ffmpeg -i input.avi -acodec libvo_aacenc -vcodec libx264 output.mp4

あとは各ファイルについてfor文などで回して処理します.

おわりに

ひとまず,低スペックな自鯖を用いてストリーミング再生できるようになりました.
ただ,前からわかってたことですが,事前にエンコードしておくコストが大きいのが問題ですね.
う〜ん,x264を高速に計算できるコンピュータが欲しい…

*1:ファイルのエンコードはサーバとは異なるコンピュータで行います

*2:例えばmp4(avc+mp3)など

*3:映像と音声にエンコードなしに分離する

*4:映像と音声をエンコードなしに結合する