コピペでできる録画サーバー on Linux with PT2 (エンコード編)

  1. コピペでできる録画サーバー on Linux with PT2 (ハードウェア編)
  2. コピペでできる録画サーバー on Linux with PT2 (OSインストール編)
  3. コピペでできる録画サーバー on Linux with PT2 (recpt1 録画編)
  4. コピペでできる録画サーバー on Linux with PT2 (epgrec 番組表編)
  5. コピペでできる録画サーバー on Linux with PT2 (再生編)
  6. コピペでできる録画サーバー on Linux with PT2 (エンコード編)

今回は録画したTSファイルをエンコードする方法をご紹介します。
またepgrecでは動作モードを指定してキーワード予約をすることが可能なので、モードの作成方法もご紹介したいと思います


エンコーダとコーデックの肝となる部分はyumではなく最新版のソースから導入していきます。


※2013/6/16
こちらを参考に修正しました。

YANO's digital garage - 2012-10-14
http://www.bravotouring.com/~yano/?d=2012-10-14

epelのインストール

http://www.tooyama.org/yum-addrepo-epel.html

x264コーデックのインストール

  • 準備
yum --enablerepo=epel -y install yasm
  • インストール
mkdir /usr/local/src/encoder
cd /usr/local/src/encoder
git clone git://git.videolan.org/x264.git
cd x264
./configure --enable-shared 
make
make install

x264用プリセットファイル

cat << '_EOF_' > /usr/local/share/ffmpeg/libx264.ffpreset
vcodec=libx264

vprofile=baseline
maxrate=10000000
bufsize=10000000

level=41
crf=25
coder=1
flags=+loop
cmp=chroma
partitions=+parti8x8+parti4x4+partp8x8+partb8x8
me_method=umh
subq=7
me_range=16
g=250
keyint_min=25
sc_threshold=40
i_qfactor=0.71
b_strategy=1
qmin=10
rc_eq='blurCplx^(1-qComp)'
bf=16
bidir_refine=1
refs=6
_EOF_
  • 自分で設定する場合はこちらを参考に

x264 FFmpeg Options Guide - Linux Encoding
http://sites.google.com/site/linuxencoding/x264-ffmpeg-mapping


aacコーデックのインストール

cd /usr/local/src/encoder
wget http://downloads.sourceforge.net/faac/faac-1.28.tar.gz
tar xvfz faac-1.28.tar.gz
cd faac-1.28
  • コンパイルに失敗するためパッチを当てる
cat << '_EOF_' > faac.patch
*** mpeg4ip_orig.h      2013-06-16 12:51:16.268008909 +0900
--- mpeg4ip.h   2013-06-16 12:52:17.348008885 +0900
***************
*** 120,125 ****
--- 120,126 ----
  #endif
  #include <sys/param.h>

+ #ifndef _STRING_H
  #ifdef __cplusplus
  extern "C" {
  #endif
*************** char *strcasestr(const char *haystack, c
*** 127,132 ****
--- 128,134 ----
  #ifdef __cplusplus
  }
  #endif
+ #endif

  #define OPEN_RDWR O_RDWR
  #define OPEN_CREAT O_CREAT
_EOF_
patch common/mp4v2/mpeg4ip.h  < faac.patch
./configure --with-mp4v2
make
make install

ffmepgのインストール

FFMEPG_VER=n2.1.1
git clone https://github.com/FFmpeg/FFmpeg.git
cd FFmpeg
git checkout ${FFMEPG_VER}
./configure --enable-libfaac --enable-libx264 --enable-gpl --enable-nonfree
make
make install

ライブラリの登録と再読込

echo "/usr/local/lib" > /etc/ld.so.conf.d/usr.conf
ldconfig

ffmpeg確認

動いた!

[root@ml110g6 FFmpeg]# ffmpeg -version
ffmpeg version 2.1.1
built on Nov 20 2013 20:34:51 with gcc 4.4.6 (GCC) 20110731 (Red Hat 4.4.6-3)
configuration: --enable-libfaac --enable-libx264 --enable-gpl --enable-nonfree
libavutil      52. 48.101 / 52. 48.101
libavcodec     55. 39.101 / 55. 39.101
libavformat    55. 19.104 / 55. 19.104
libavdevice    55.  5.100 / 55.  5.100
libavfilter     3. 90.100 /  3. 90.100
libswscale      2.  5.101 /  2.  5.101
libswresample   0. 17.104 /  0. 17.104
libpostproc    52.  3.100 / 52.  3.100

エンコード確認

とりあえずTSファイルをエンコードしてみましょう。

  • まずは10秒ほど適当な番組を録画
recpt1 --b25 --strip 24 10 test.ts
ffmpeg -y -i test.ts -f mp4 -vcodec libx264 -fpre /usr/local/share/ffmpeg/libx264.ffpreset -filter:v yadif -s 1280x720 -aspect 16:9 -r 30000/1001 -b:v 2M -bt 2M -vsync 1  -threads 0 -acodec libfaac -ac 2 -ar 48000 -ab 128k test.mp4

オプション解説

test.ts エンコードするTSファイル
-fpre /usr/local/share/ffmpeg/libx264.ffpreset x264用プリセットファイル
30000/1001 フレームレート 30fps
-filter:v yadif インターレース解除
-b 2M -bt 2M ビットレートビットレートの誤差
-aspect 16:9 アスペクト比
-s 1280x720 サイズ
-ab 128k 音声のビットレート
test.mp4 エンコード後のファイル名

上記の設定を変更し好みの画質とサイズになるまで調整しましょう。
主に調整する場所はビットレートになるかと思います。

epgrecにエンコードのモードを追加

録画モードと記述してある部分を以下のように修正

$RECORD_MODE = array(
        // ※ 0は必須で、変更不可です。
        0 => array(
                'name' => 'Get EPG',    // モードの表示名
                'suffix' => 'epg_.ts',      // ファイル名のサフィックス
        ),

        1 => array(
                'name' => 'Minimum TS', // 最小のTS
                'suffix' => '_tss.ts',  // do-record.shのカスタマイズが必要
        ),

        2 => array(
                'name' => 'Encode TS to x264',
                'suffix' => '.mp4',
        ),

);

epgrecのモードごとの動作を設定

  • do-record.sh

ENCODE=の中身は、先程自分で設定したコマンドを記述してください。
最終行のrmコマンドはエンコード後に録画したtsファイルを削除する場合は、コメントアウトを外して利用してください。

#!/bin/sh
echo "CHANNEL : $CHANNEL"
echo "DURATION: $DURATION"
echo "OUTPUT  : $OUTPUT"
echo "TUNER : $TUNER"
echo "TYPE : $TYPE"
echo "MODE : $MODE"
echo "SID  : $SID"


# fail safe
case $CHANNEL in
    101|102|191|192|193)
        if [ $SID = 'hd' ]; then
            SID=$CHANNEL
        fi ;;
esac
if [ -z $SID ]; then
    SID='hd'
fi
###########################################
## replace space to under bar
OUTPUT=`echo ${OUTPUT} | sed 's/  */_/g'`
TMP_OUTPUT=${OUTPUT}_tmp.ts

## record CMD
RECORDER=recpt1
GETEPG_TS_REC="$RECORDER --b25 --strip --sid epg  $CHANNEL $DURATION"

FULL_TS_REC="$RECORDER --b25 --strip $CHANNEL $DURATION"
MIN_TS_REC="$RECORDER --b25 --strip --sid $SID $CHANNEL $DURATION"
case $CHANNEL in
    23|24)
        MIN_TS_REC=${FULL_TS_REC}
        ;;
esac

## encode CMD
ENCODER=ffmpeg

# video
X264_PRESET="/usr/local/share/ffmpeg/libx264.ffpreset"
CODEC="-f mp4 -vcodec libx264"
DEINTERLACE="-filter:v yadif"
RESIZE="-s 1280x720"
ASPECT="-aspect 16:9"
FRAME_RATE="-r 30000/1001"
BIT_RATE="-b:v 2M -bt 2M"

OPT_VIDEO="${CODEC} -fpre ${X264_PRESET} ${DEINTERLACE} ${RESIZE} ${ASPECT} ${FRAME_RATE} ${BIT_RATE} -vsync 1  -threads 0"

# audio
OPT_AUDIO="-acodec libfaac -ac 2 -ar 48000 -ab 128k"

# ts
#TS_OPT="-map 0:0 -map 0:1"

# cmd
ENCODE_CMD="$ENCODER -y -i ${TMP_OUTPUT} ${OPT_VIDEO} ${OPT_AUDIO} ${TS_OPT}"
############################################

if [ ${MODE} = 0 ]; then
   # MODE=0 EPG取得用(変更しないこと)
   $GETEPG_TS_REC "${OUTPUT}" > /dev/null
elif [ ${MODE} = 1 ]; then
   # 基本的な番組のみ録画
   $MIN_TS_REC "${OUTPUT}" > /dev/null
elif [ ${MODE} = 2 ]; then
   # FULL_TSで録画してエンコード
   echo "$FULL_TS_REC ${TMP_OUTPUT}"
   $FULL_TS_REC "${TMP_OUTPUT}" > /dev/null
   echo "$ENCODE_CMD ${OUTPUT}"
   $ENCODE_CMD ${OUTPUT}
   #rm "$TMP_OUTPUT"
fi
  • 確認

以下コマンドを実行してエンコードまで自動的に行われればOK

OUTPUT=test.mp4 CHANNEL=27 DURATION=5 TUNER=0 MODE=2 TYPE=GR /var/www/epgrec/do-record.sh

TV番組表から動作確認

予約カスタマイズからエンコードのモードを選択して予約しましょう。
エンコードまで自動的に行われれば完了です。

参考

Between Winds and Clouds » ライブラリのインストール (aac)
http://drag0n.fam.cx/?page_id=352
最新FFmpeg - MobileHackerz Knowledgebase Wiki
http://mobilehackerz.jp/archive/wiki/index.php?%BA%C7%BF%B7FFmpeg
ffmpeg で TS をできるだけ高画質な mp4 へ変換してみた - I’m just another TeXnician.
http://d.hatena.ne.jp/munepi/20091227/1261941397
ぱぱネット(仮)(2009-07-01)
http://linux.papa.to/?date=20090701
TSファイルをffmpegでmp4にエンコード - 自宅PCの設定記録
http://dambo.no-ip.org/pwiki/index.php?TS%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92ffmpeg%E3%81%A7mp4%E3%81%AB%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%89
CentOS LinuxにWebM/VP8組込みのFFmpegをインストール 「知ったかブログ」
http://kenknown.blog42.fc2.com/blog-entry-208.html

http://www.sky.sannet.ne.jp/kn_ishi/epgrec/centos55_pt2_epgrec.html