読者です 読者をやめる 読者になる 読者になる

中年engineerの独り言 - crumbjp

LinuxとApacheの憂鬱

TV録画&エンコードサーバ構築(エンジニアリング禁断症状)

私事ですが、、育児休暇を取得して1ヶ月程エンジニアリングから離れております。

しかし性なのか、2週間もするとLinux触りて〜!!』的な禁断症状が現れてきて
気付くと(これからは子供番組の録画が必要だよね!!)って事でこの辺り(コピペでできる録画サーバー on Linux with PT2)を参考に録画サーバを立てていました。

意外と大変だったのでメモを残しとこうかと。。

問題

AFT HDD(AFT3TB)
物理セクタを拡大した新方式のHDD。大容量になるがFDISKのMBRでは扱いきれない!
faac
O3するとSEGVで動かず。。
libx264
mplayer等のライブラリと競合してビルドできない(faac関連でコケル)。OSインストール直後にやっておくべし。※結構厄介
mencoder
音声ストリームが巧く認識できず・・・
ffmpeg
2012/5/4現在、ビルドするとオプションが色々変わってる。。。(manも不完全)
CS番組は4チャンネル混合?
エンコード時に分離するのが大変。

AFT HDD(AFT3TB)

いまどきの最初の難関。

直接CentOS6を入れようとすると大変なだけで、OSは小容量SSDに入れて、後から追加するなら問題は無い。

  • CentOS6インストーラパーティションツールはfdisk。
  • fdiskはGPTには対応してない。(よって2.2TB程度までしか扱えない)
  • 普通にインストールするとfdiskでパーティション切る事にになりMBRになってしまう。
  • MBRからGPTに変更する事はできない。(データが消える)

という事で、インストールDVDから普通にインストールすると詰みます。(ましたorz...)

作戦
  1. 先にLiveCDから起動してパーティションを切る
  2. 上記のパーティション上にCentOSをインストール
  3. ついでにlvmも使う
用意するもの
手順

1.LiveCDからブート
2.terminalを起動(そのままinit 3しても良いかも)
3.parted起動

$ parted 

以降partedのinteractive-mode
4.状況を確認

(parted) print free

5.パーティションテーブルを作る

(parted) mklabel gpt

6.ATFの論理セクタと物理セクタのアラインアンマッチを避ける※ここが肝!!
この辺りが詳しいです。
セクタ指定で8の倍数を指定するのが本当ですが、、サイズを計算するのが面倒なので代替案です

(parted) unit MiB

7.各パーティションを切る

# BOOT
(parted) mkpart primary ext4 64s 1000
# SWAP
(parted) mkpart primary linux-swap 1000 3000
# SYSTEM
(parted) mkpart primary ext4 3000 43000
# DATA (-1s 最後までの意)
(parted) mkpart primary ext4 43000 -1s

8.後は普通にLVM切るだけ。(省略)

faac

普通にこれでよい。

./configure --with-mp4v2 
libx264

この辺りを追加した。

--extra-cflags="O4" --extra-ldflags="O4"
ffmpeg

yum版のffmepg-develを入れて--formatsでビルドオプションを確かめ、削除されたオプションを消した。(依存ライブラリをインストールする意味もある)

これらは独自ビルドしているのでyum removeしておく。

  • libx264-devel
  • faac-devel

speexは色々面倒だし使わないので外した。

./configure --prefix=/usr/local --disable-avisynth --extra-cflags='-O4 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -fPIC' --enable-avfilter --enable-libdc1394 --enable-libfaac --enable-libgsm --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-librtmp --enable-libschroedinger --enable-libtheora --enable-libx264 --enable-gpl --enable-nonfree --enable-postproc --enable-pthreads --enable-shared --enable-swscale --enable-vdpau --enable-version3 --enable-x11grab --enable-pic
CS番組は4チャンネル混合?

TSは巨大過ぎるのでエンコードする事にした。
ただE-450(BIOS省電力設定)は非力なので爆速エンコ設定(低画質)しかない。
 この設定でやっと30fps位出る。画質的には我慢できる程度(見て終わりの番組はこれでいい)。

更に再生も同じマシンで行うのでエンコードと重なる再生に支障が出る。
 なのであえてepgrecと連携せずにcronでキックする。

地デジTSにはワンセグが混じってるし、CSチャンネルは複数の番組が混じってるのでエンコード時に対象を選択しなきゃならない。

エンコテストも含めてffmepgのオプションを手書きするのは苦痛なのでスクリプト化した。
mencode.pl(github)

こんな感じで使う。

 $ ./mencode.pl -f ~/video/ディスカバリ/怪しい伝説??.ts
  [Program 308]
   - 0:3 : , yuv420p, 720x480 [SAR 32:27 DAR 16:9], 2000 kb/s, 33.91 fps, 29.97 tbr, 90k tbn, 59.94 tbc
   - 0:7 : , 48000 Hz, stereo, s16, 222 kb/s
  [Program 340]
   - 0:0 : , yuv420p, 720x480 [SAR 8:9 DAR 4:3], 2000 kb/s, 37.68 fps, 29.97 tbr, 90k tbn, 59.94 tbc
   - 0:1 : , 48000 Hz, stereo, s16, 143 kb/s
  [Program 307]
   - 0:5 : , yuv420p, 720x480 [SAR 32:27 DAR 16:9], 2000 kb/s, 48.41 fps, 29.97 tbr, 90k tbn, 59.94 tbc
   - 0:6 : , 48000 Hz, stereo, s16, 182 kb/s
  [Program 341]
   - 0:4 : , yuv420p, 720x480 [SAR 32:27 DAR 16:9], 2000 kb/s, 44.96 fps, 29.97 tbr, 90k tbn, 59.94 tbc
   - 0:2 : , 48000 Hz, stereo, s16, 139 kb/s
Please select program : -p ??? or -p auto

Program:340がディスカバリチャンネルなので、これでエンコード

 $ ./mencode.pl -f ~/video/ディスカバリ/怪しい伝説.ts -p 340

地デジなどは(FullHigh , ワンセグ)の順で入っているようなので、autoを指定しても大丈夫かと(auto="最初のProgram")

 $ ./mencode.pl -d ~/video/地デジ -p auto

仕様

  • プログラム番号を指定-p
  • 入力ファイルをディレクトリ指定 -d
  • 入力ファイル指定 -f
  • 空実行 --dry-run
  • エンコード済みのファイルはスキップする。(ファイル名で判断)
    • ただし、--forceで無視
  • 録画中のTSはスキップする。(ファイルサイズが変化しているか否か)
  • 音声ストリームが複数あっても対応できる。

ToDo

  • CMカッター

メモ

まだなんか気付いたり気が向いたら追記する。