さくらのVPSで動画を楽しむ – ffmpeg トランスコード ストリーミング ts h.264 x264 変換

 レンタルサーバを使って動画を楽しむ話。
 さくらのVPSの処理能力の高さは各所で言われているとおりで、今回は、このパフォーマンスを動画処理に活用してみた。

 自宅の録画サーバはAMD E-350プロセッサ(2コア1.6GHz)で、PLEX PX-W3PEを挿して、地上2ch・衛星2chの同時録画が出来る静音マシンにしている。 RecTaskを使って録画しているのでファイル形式はTSだ。
 TSファイルは、基本的にMPEG2ビデオとAACオーディオ(場合によってはAC3)のタイムストリームで、地上波なら1時間7GB程度の大きなファイルだ。 スマホなどで見ようとすると32GBのmicroSDHCを使っても4時間少々しか入らず、入れ替えが面倒なので、これをコンパクトに圧縮(トランスコード)して保存活用するのがスタンダード。
 しかし、TSの直録画をしている分にはE-350でもこなせるが、トランスコードしようとなると非力すぎで、Core i7等のハイパフォーマンスPCが欲しくなってくる訳だが、この作業をさくらのVPSに任せてしまおうと画策したわけだ。

 基本的な流れ。

  • 1,録画サーバから1日1回、レンタルサーバにTSファイルをFTPで自動アップロードする(タスクスケジューラ設定でOK)
  • 2,レンタルサーバでアップロードディレクトリを監視して変換処理を行う(cronバッチシェルffmpeg
  • 3,トランスコードしたファイルをhttpディレクトリに移動する。 また、アップロードファイルを削除する。

1:
録画サーバはWindowsHomeServer2011なのでPowerShellで簡単作成。
事前に

Set-ExecutionPolicy RemoteSigned

して、シェル実行可能に設定(PowerShellの実行権限設定について参考:Paddle Log Point

PSバッチを作成(c:\shells\tsup.ps1)

echo “open ホスト名rnユーザ名rnパスワードrnbinrn" | Out-File d:\uploadcmd.txt -encoding Default
foreach($file in ls d:\ts\*.ts){
echo "put $file" | Out-File d:\uploadcmd.txt -encoding Default -append
}
echo "quit" | Out-File d:\uploadcmd.txt -encoding Default -append
ftp -s:d:\uploadcmd.txt
mv d:\ts\*.ts d:\ts_backup\

d:¥tsディレクトリ中の.tsファイルを全てアップロードするftpコマンドリストを作って、ftpコマンドに食べさせて、処理済みtsファイルをバックアップディレクトリに移動するというPSスクリプトだ。
-encoding Defaultにしないと、文字コードがUNICODEになるが、ftpコマンドのコマンドリストはローカルエンコーディングでないとエラーになるので指定している(リダイレクトもUNICODEになるからOut-File使用)
このPSを録画のない時間帯にタスクマネージャで回せばOK

2:
変換ツールを導入する

wget ftp://ftp.videolan.org/pub/x264/snapshots/last_x264.tar.bz2
bzip2 -d last_x264.tar.bz2
tar xf last_x264.tar
cd x264-snapshot-*
./configure
make
make install

wget http://sourceforge.net/projects/faac/files/faac-src/faac-1.28/faac-1.28.tar.gz/download
tar xzf faac-1.28.tar.gz
cd faac-1.28
./configure
make
make install

wget http://ffmpeg.org/releases/ffmpeg-0.9.1.tar.gz
tar xzf ffmpeg-0.9.1.tar.gz
cd ffmpeg-0.9.1
./configure --enable-libfaac --enable-pthreads --enable-libx264 --enable-gpl
make
make install

x264、faacをビルドしてから、ffmpegをビルドする(ffmpegで前2個のライブラリを使うのでffmpegは必ず最後。 他にも色々なライブラリを導入することも出来るが、今回は最低限のマルチスレッドモジュールとAACとX264エンコーダだけ追加している)

後は、必要なプリセットやパラメータを決めてcronでバッチシェルを回せばよい。
私の場合は、中間シェルを作成。

h264encode.sh

filename=$1
posi=$*
shift
expr $posi -1
ffmpeg -y -i $filename -vn -f wav -acodec pcm_s16le -shortest $filename.wav
ffmpeg -y -pre /root/high.preset -i $filename -i $filename.wav -map 0:0 -map 1:0 -f mp4 -vcodec libx264 -crf 20 -level 41 -r 30000/1001 -aspect 16:9 -s 1280x720 -acodec libfaac -ac 2 -ar 48000 -ab 128k -threads 4 -vsync 1 -async 1 -shortest -deinterlace -top -1 $* ../out/$filename.mp4
ffmpeg -y -i $filename -i $filename.wav -map 0:0 -map 1:0 -f mp4 -vcodec libx264 -vprofile baseline -level 30 -crf 22 -r 30000/1001 -aspect 16:9 -s 400x240 -acodec libfaac -ac 2 -ar 48000 -ab 128k -threads 4 -vsync 1 -async 1 -shortest -deinterlace -top -1 $* ../out/$filename-walkman.mp4
rm $filename.wav

high.preset

vprofile=high
coder=1
level=41
deblockalpha=0
deblockbeta=0

qmin=7
qmax=28
qdiff=4
qcomp=0.8
i_qfactor=0.71
keyint_min=25
sc_threshold=40

me_method=umh
refs=10
subq=6
trellis=2
bf=16
me_range=24
g=250
b_strategy=2

partitions=+parti4x4+parti8x8+partp4x4+partp8x8+partb8x8
cmp=+chroma

flags=+loop
flags2=+bpyramid+mixed_refs+wpred+dct8x8+fastpskip

directpred=3
wpredp=2
rc_lookahead=60
rc_eq='blurCplx^(1-qComp)'
bidir_refine=1

こんな感じの設定をしている。

で、メインシェル↓をcronで回している。

cd /home/transcode/up
files="/home/transcode/up/*.ts"
for filepath in ${files}
do
sh /root/h264encode.sh ${filepath}
mv ${filepath} /home/transcoder/finished_ts/
done
echo "open HTTPサーバアドレス" > /root/ftpcmd
echo "user ユーザ名 パスワード" >> /root/ftpcmd
echo "bin" >> /root/ftpcmd
files="/home/transcode/out/*.mp4"
for filepath in ${files}
do
filename=
echo ${filepath} | sed -e “s/\/.*\///g”
echo $filename
ext=
echo ${filename} | sed -e “s/^.*[\.\/]//g”
file=
echo ${filename} | sed -e “s/\.[^.]*$//g”
filename=
echo ${file} | nkf -w80MQ | sed -e “s/=$//” | tr -d ‘\n’ | tr = %`
filename=”${filename}.${ext}”
echo “put \”${filepath}\” \”${filename}\”” >> /root/ftpcmd
done
ftp -n -i < /root/ftpcmd cd /home/transcode/out for filepath in ${files} do mv ${filepath} /home/transcode/finished_mp4/ done

サーバの構成
/home/transcode/up #録画サーバからTSをアップするディレクトリ
/home/transcode/out #エンコードしたMP4が一時的に置かれるディレクトリ
/home/transcode/finished_ts #エンコード済みのTSが保管されるディレクトリ
/home/transcode/finished_mp4 #エンコード済みのMP4が保管されるディレクトリ
 これで、/home/transcode/finished_mp4以下にファイルネーム.mp4のHDファイルとファイルネーム-walkman.mp4のWalkmanA860用ファイルの2個が出来ている。
 また、別のHTTPサーバにもFTPでアップロードしている(アップロード時にファイル名をurlencodeしている)ので、レンタルサーバの動画データは定期的に消す(tmpwatchでも良い)

 最初にwavに分離してエンコードしているのは、これをしないと音ズレが発生するため(おそらく、TSファイルのストリームの時間データが狂っていて、直接TSからストリームを取り出すと時間を合わせようとして逆に狂うようで、一度wavにはき出しておくと割と音ズレを小さくできる)

 後は、Androidケータイのブラウザでファイルをタップするとプレイヤー選択が出てくるから、好きなプレイヤー(私はMeridian使用)を選べばダウンロードしないで再生できる(HTTPのRangeヘッダーを使うことでファイルの任意の場所を転送できるため、全部をダウンロードしないでも任意の位置から再生できる) PCのChromeとかでも少しバッファリングするだけで再生できる。
 ISW11Fでは、今回のHD設定ファイル(1280×720 High@4.1 3Mbps程度)でもハードウェアデコードでストリーミング再生可能。
 ただし、3Gだとすぐにパケット規制上限(3日300万パケットが規制ラインだけど、30分再生で400万パケットくらい流れる)がかかるので、実質的にはWiFi・WiMaxで繋いでいるとき限定の使い方。 また、3G回線時のスループット的には、Walkmanプロファイル(400×240 Baseline@3.0 400Kbps)の方がなめらかだろう。

 さくらのVPS 4GBはhome以下の容量が100GBだが、完成品が1時間1GB位、原料が1時間7GB位消費するのと、他の用途も兼ねていて容量を使いたくないので、完成品ファイルは配信用の別のサーバに転送している。
 配信用(と言っても認証をかけて自分専用にしている)サーバは、私の場合、WAPPYのミドルプランを利用している。
容量150GBで転送量無制限、月額700円程度で済む格安レンタルサーバ。
エンコード済みファイルなら150時間分入れておけるのでソコソコのライブラリとして使えてオススメ。
しかし、普通の共用サーバなので、プログラムなどを自由に動かしたい場合にはSaasesのOsukini ST VPSが、月額980円で100GBの容量があって良いかもしれない。

 HTTPで配信する場合、mimeタイプ設定(root権限付きサーバなら/etc/mime.typesにvideo/mp4 mp4追記、共用サーバなら.htaccessにAddType video/mp4 mp4を記述)を忘れてはいけない。

※flags2のオプションが新しいバージョンのffmpegで動かないらしい(参照:お気に入りの動画を携帯で見よう 対応パッチが置いてあるので利用させて頂く)

(2913)

カテゴリー: LAMP[Linux, Apache, MySQL, PHP] | コメントをどうぞ

VPSはオトクなのか

 さくらのVPS 4GBプランを新規契約した時にVPSはオトクなのか考えた話。

1,電気料金
 さくら 4GB のUnixBench Indexは2200程度、Core i5(2コア+HT)クラスのマシンに相当する。
 このクラスのPCを24時間稼働して従量電灯の1~2段階料金だと月額約2000円の電気代がかかる。
 と言うことは、月額3980円から2000円は電気代と思って良いだろう。

2,回線料金
 さくらのネットワーク転送実レートは上り下り6MB/s程度出る。 48Mbpsだから、ADSLは超えてFTTHレベル。 Bフレッツが月額5460円なので、これだけでオーバーしている。
 更に、固定IPが割り振られる訳だが、固定IPプロバイダは最安値で月額1500円程度。
 ここまでで、自宅にサーバを設置した場合に比べて毎月5000円ほどオトク。

3,機材価格
 更に、機材の代金がかかる。
 処理性能に相当するサーバだとNECとかHPの2万円程度で買える特売サーバが相当するだろう。
 安い無停電電源等の設備も入れたとして一式4~5万円程度なので、初期費用の1万円に対しても遙かにオトク。

 また、無停電電源のバッテリのような寿命がすぐ来る(安いもので2年程度)部品交換や、サーバの部品が故障して交換したりすること、夏場は冷却が必要なことなどを考えると、どうやっても個人で用意する場合に比べて遙かにお安く済むのは確実だ。 と言うか、シリアルな演算の性能(高クロック&クロックあたり処理能力)を求めなければ、サーバ契約を横に増やしていくのがオトクだろう。
 はっきり言って、さくらの8GBとか、商用サイトを普通に運営できるレベルだ。 マネージドとかの要求がなければ普通にいける。
 このブログもさくらでWebサーバとDBサーバを構築している(1台はASPを動かすためにWindows化して、もう1台はLinuxで動かしている)
 完全仮想化なので、LiveCD LinuxをGRUBからISOブートして、hdaをddしてどこかに置けば災害対応のイメージバックアップも普通に取れる。

 クラウドのように変動が無く、定額で予算化できるのも良い(逆にクラウドのようにリソースを適時投入は出来ないが、同じ程度の処理能力を確保しておくなら、クラウドより安い)

(110)

カテゴリー: LAMP[Linux, Apache, MySQL, PHP] | コメントをどうぞ

ServersMan@VPSのフルバックアップを取る – rsync sshfs

 さくらのVPSでは完全仮想化のおかげでddやdumpで簡単にイメージバックアップによるフルバックアップが取れるのだが、ServersMan@VPSでは準仮想化のためイメージバックアップが出来ないのでrsyncを使ってバックアップを取ることにした。
 バックアップ先は自宅のファイルサーバを利用する。
 ファイルサーバのサービスを追加したくないので既存のファイル共有サービスを利用してバックアップしたいのだが、ServersMan@VPSではリモートのnfsやsmbのファイルシステムをサポートしていない。 だが、fuseがサポートされていた↓

#cat /proc/filesystems
ext2
ext3
nodev proc
nodev sysfs
nodev tmpfs
nodev devpts
nodev binfmt_misc
nodev fusectl
nodev fuse
nodev rpc_pipefs

 fuseがサポートされていると、sshfsが使える。
 sshfsは名前の通り、sshを経由してリモートの記憶域を利用できるファイルシステム。
 標準のyumリポジトリにはsshfsは入っていないので、rpmforgeから取ってくる。

#wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.2-2.el5.rf.i386.rpm #リポジトリ追加のためのRPMを取得
#rpm -iv rpmforge-release-0.5.2-2.el5.rf.i386.rpm #取得したRPMからリポジトリを追加
#vi /etc/yum.repos.d/rpmforge.repo #標準でrpmforgeが有効になっているので無効にする↓enabledを1から0へ変更
enabled = 1 > enabled = 0
#yum install –enablerepo=rpmforge fuse-sshfs #rpmforgeリポジトリを使ってfuse-sshfsパッケージを導入する(おそらく依存関係も表示される)
#mkdir /mnt/fileserver #マウントポイントを作る
#sshfs remoteuser@fileserver.hoge.piyo:/home/remoteuser /mnt/fileserver #fileserver.hoge.piyo=自宅サーバのユーザー名remoteuserで/home/remoteuserをServersManの/mnt/fileserverにマウントする

 これで/mnt/fileserverが自宅のファイルサーバに繋がったので、後はディレクトリ指定でrsyncすればOK

 rsyncバックアップで除外するリストを作る。

#cat > /root/rsync_exclude_list
– /dev
– /sys
– /proc
– /mnt
ctrl+d

※本当は他にも除外した方が良い物があるが、最低限の記述で済ませた。

 rsyncを実行する。

rsync -avzHAX –exclude-from=/root/rsync_exclude_list / /mnt/fileserver/backup

オプション:
a:各種属性やソフトリンク等を維持する
v:進行状況を詳細に表示する
z:圧縮する
H:ハードリンクも維持する
A:ACLを維持する
X:拡張属性を維持する

 これでフルバックアップが取れる。
 普通はrsync to rsyncでバックアップを取る方法もあるけど、経路暗号化とサービス追加不要というポイントでrsync on sshfsにした。

(743)

カテゴリー: サーバ設定 | コメントをどうぞ

Windows化したさくらVPSでVPNを利用する – IPSec メインモード MR504DV

 先日、RTX1000とさくらのVPS(Windows化済み)の間でアグレッシブモードのIPSecによるVPNを構築したが、3rdルータに固定IPがあるので、メインモードで再構築した(前回はShrewだったが、今回はWindows標準のVPN機能IPSecで実現)
3rdルータはOMRONのMR504DVである。

MR504DVのIPSecに関わる設定
ipsec 2 valid on
ipsec 2 policy localip 192.168.0.0/24
ipsec 2 policy remoteip さくらのip
ipsec 2 policy dstgwip さくらのip
ipsec 2 ike dir responder
ipsec 2 ike psk 事前共有鍵
ipsec 2 ike enc des
ipsec 2 ike keepalive on d=さくらのip
ipsec 2 ike autocon on
ipsec 2 ike lifetime isakmp 3600
ipsec 2 ike lifetime ipsec 3600
ipsec 2 esp enc des
ipsec 2 pmtud dfbit off
ipsec 2 mss mode on
ipsec 2 natt mode on
ipsec 2 natt nego on

Windows(さくらのVPS)側の設定
スタート>コンパネ>管理ツール>ローカルセキュリティの設定
左ツリー:IPセキュリティポリシー
右ペインで右クリック>IPセキュリティポリシーの作成
ウィザードが起動、名前と説明を適当に設定、既定の応答規則をアクティブにする:Checked、次の文字列をキー交換(事前共有キー)の保護に使う:Checked&事前共有鍵を設定、プロパティを編集する:Checked

既定の応答フィルタの編集
セキュリティメソッド>追加>カスタム>暗号化をしないデータとアドレスの整合性:Unchecked,データの整合性と暗号化:Checked,整合性アルゴリズム:MD5,暗号化アルゴリズム:DES,新しいキーの生成間隔:Checked&3600秒に1回
認証方法>追加>次の文字列を使う:Checked&事前共有鍵を設定

追加の規則の作成
規則>追加>次のIPアドレスでトンネルエンドポイントを指定する:Checked&MR504DVの固定IPを指定>全てのネットワーク接続:Checked>IPフィルタ:追加>名前と説明を適当に設定、追加>ミラー化:Checked>発信元アドレス:このコンピュータのIPアドレス>宛先アドレス:特定のIPアドレス:192.168.0.0&255.255.255.0>プロトコルの種類の選択:任意
作成したフィルタを選択>セキュリティが必要>事前共有鍵を設定して終了。

作ったポリシーを右クリックして、割り当てをすると即座に適用される。
ping 192.168.0.1
とか打つと
Negotiating IP Securityとか、何回か出てくるが、IPSecが確立すれば、後は普通にVPN通信できる。

  • 関連
  • 関連
  • (892)

    カテゴリー: LAMP[Linux, Apache, MySQL, PHP] | タグ: , | コメントをどうぞ

    安いサーバには安いなりの設定を その2 – Apache設定 httpd.conf prefork.c

     httpd.confのデフォルト設定では、
    MaxClinets 256
    ServerLimit 256
    になっている。

     これは、Apacheが最大256プロセス起動して256コネクションに応答するという設定。
     さて、これは適切な設定なのだろうか?
     メモリ状況をベースに検討してみる。
     Apacheが停止した状態でメモリ状況を確認。
    #free

    total used free shared buffers cached
    Mem: 514912 376800 138112 0 144052 203260
    -/+ buffers/cache: 29488 485424
    Swap: 1048568 2852 1045716

     Apacheの1プロセスが消費するメモリを確認。
    #ps alx|grep httpd
    F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND
    5 48 32222 32212 21 0 39112 3872 374588 S ? 0:00 /usr/sbin/httpd
    ・・・

     RSSが実際に使用されているメモリ量で、この場合、3872KB使われていると言うこと。
     256プロセスだと、3872KB*256=968MBのメモリを消費するという計算。
     空きメモリはいくつあったかというと、freeの結果に、138112KB(134MB)と書かれている。 Linuxでは、bufferとcacheについては必要に応じて切り出して使用できる(と言っても、少し残しておかないと応答が低下するので、全ては使えないが)ので、buffers:144052KB(140MB)とcached:203260KB(198MB)を加えた472MB位まで使える(-/+ buffers/cache:のfree値)わけだが、使えるメモリの2倍ほどを消費してしまうことになる。

     使えるメモリをhttpdの消費メモリで除算すると
    485424/3872=125
    であるから、125プロセスまでが物理メモリに収まると言うことになる。

     ServerLimit 256だと、126プロセス目が立ち上がるとスワップが発生し、その応答が遅くなり、処理できないうちに次のリクエストが来ると127プロセス目を立ち上げようとして、処理できずに更に128プロセス・・・となって、プロセスが増え続ける。
    すると最終的にシステムが応答不能に陥って見かけ上ダウンする(あるいは、高負荷で実際にダウンする)
     故に、MaxClients/ServerLimitを125以下に制限するべきである。

     ついでなので、prefork.c設定を解説しておく。
    ・StartServers
     httpd startしたときに起動するプロセスの数。 多くすると初期の起動が遅くなるし、必要に応じてプロセスはServerLimitまで追加されていくので、数個起動しておけば問題ないはずだ。
    ・MinSpareServers
     プロセスの予備数の最低値で、アクセスがない状態ではプロセスを自動終了するけど、この数のプロセスは最低限残しておく。 これが小さいと、急にアクセスが来たときにプロセスを起動する遅延が発生するが、大きいとアクセスがない状態でもメモリを消費し続ける。
    ・MaxSpareServers
     MinSpareServersの逆で、アクセスが集中してプロセスが大量に立ち上がった後に、アクセスが減ると、アクティブな接続がないプロセスはこの数を残して自動終了される。
    ・MaxRequestsPerChild
     一つのプロセスが処理するリクエストの上限を設定する。 この数までリクエストを受け付けたプロセスは終了される。 プロセス内でメモリリークを起こした場合等に一度停止させることでメモリを解放させる効果などがある。

     あるPHPプログラムでメモリを消費したときに、Apacheの1プロセスが300MB近いメモリを確保しながら、ページ読み込みが終了しても開放せず、予想外のメモリ消費を起こしてシステムがダウンする事があったので、MaxRequestsPerChildに適当な値を設定しておくことで運用的に暫定対応した事もある。

    (227)

    カテゴリー: サーバ設定 | コメントをどうぞ

    安いサーバには安いなりの設定を その1 – OS 基本設定 ServersMan@VPS さくらVPS

     そもそもの基本
     x86_64(64bit)だと消費メモリがとても多い(Apacheのデフォルトで実メモリ30MB以上消費する)
     安いプランでレンタルサーバを使う場合には、i386(32bit)をインストールする。
     これは、単純な話、変数の基本型を特に指定せずに使う場合、32bit環境では32bit、64bit環境では64bitの長さになるので、64bit環境は32bit環境の2倍のメモリを消費する。
     32bitの長さで表現できる値を扱う限りにおいては、64bit環境より32bit環境の方がコンパクトであるわけである。
     基本的には64bit環境はメモリアドレスが4GBを超える場合に必要になってくる物と考えて良いだろう(私は4GBプランを32bitで使っている)

     後は、デフォルトで入っていて不要なiSCSIサービスを止める。
    chkconfig iscsi off
    chkconfig iscsid off
    iSCSIはSCSIをIP上に乗っけたプロトコルだが、レンタルサーバで使うことはまず無いだろう。

     さくらのVPS 512では、512MBメモリで64bitOSがデフォルトになっているが、パフォーマンスを考えると、64bit変数が重要でなければ32bitに切り替えるのをオススメしたい。 256MBしか保証メモリがない ServersMan@VPS
    Entryプランだったら必ず32bitを選ぶべきだろう。

    (221)

    カテゴリー: サーバ設定 | コメントをどうぞ

    パーミッションを許可すると逆に動作しなくなる – sendmail 777 error World writable directory

     普通、パーミッションが不足して読み書きできずに動作不良が起こることがあるけど、sendmailは逆に、パーミッションが許可しすぎで止まることがある。
     このとき出るのが、World writable directoryと言うエラーメッセージ。

     /etc/mail と言うディレクトリにsendmailの設定ファイルが入っているのだけど、このディレクトリを777にしていると、このエラーが出て止まってしまう。
     セキュリティを考慮して、sendmailは自由に読み書きできるディレクトリを許容しない。
     755とかに変更して、書き込み権限を除去すると動作するようになる。
     デフォルトの設定では問題ないんだけど、操作ミスとかで許可してしまったりすると動作停止してしまうので注意したい。

     また、sudoを許可する /etc/sudoers も0440に設定しないと動作しない。

    (862)

    カテゴリー: サーバ設定 | コメントをどうぞ