コピペでできる録画サーバー 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
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にエンコードのモードを追加
- config.php
録画モードと記述してある部分を以下のように修正
$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
参考
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