ts ファイルを mp4 にバッチで変換する。

PT2 二本刺しで、テレビをがんがん録画しているのだが、例によって例のごとく、あまり見る暇がなくて、そのまま HDD の肥やしになっている。 あたりまえだが、HDD 資源は有限なので、そのうちあふれます。いくら zfs ででかい NAS 作ったとしても1時間当たり5GBものサイズではきついです。

ということで、生ts ファイルを適当に再圧縮して保存することにします。Windows 環境であればいろいろやり方があるのですが、今の時期、そのためだけに windows 環境を常時起動させておくわけにはいきませんし、できれば自動的に変換かけてくれるとらくちんです。ということで、いろいろ調べて下記の スクリプトに落ち着きました。 とりあえず、mp4box と ffmpeg を使えるようにしてください。あと、x264も使います。

#!/bin/sh PATH=/bin:/usr/bin:/usr/local/bin

if [ ! -e $1.mp4 ] ; then touch $1.mp4 TEMPFILE=mktemp encXXXXXXXX || exit 1 ln -s $1 ${TEMPFILE}.ts

    ffmpeg -i ${TEMPFILE}.ts -acodec copy ${TEMPFILE}.aac
    ffmpeg -i ${TEMPFILE}.ts -threads 4 -deinterlace -s hd720  -aspect 16:9 -r 29.97 -vcodec libx264 -g 300 -b 1600000 -f h264 ${TEMPFILE}.264
    mp4box -fps 29.97 -add ${TEMPFILE}.264 ${TEMPFILE}.mp4
    mp4box -add ${TEMPFILE}.aac ${TEMPFILE}.mp4
    mv -v ${TEMPFILE}.mp4 $1.mp4
    rm ${TEMPFILE}.ts ${TEMPFILE}.wav ${TEMPFILE}.aac ${TEMPFILE}.264 ${TEMPFILE}

else echo “skpping $1” fi

で、うちの環境では録画ファイルに日付が入るようにしていますので、 cron で毎晩23時に前日の録画を自動的にエンコードするようにしています。

追記:2011-11-26

いろいろ試行錯誤して、現在はこんな形に。

#!/bin/sh PATH=/bin:/usr/bin:/usr/local/bin:$HOME/bin if [ -e /tmp/stop_enc ] ;then exit fi

if [ ! -e “$1.m4v” ] ; then touch “$1.m4v” TEMPFILE=mktemp encXXXXXXXX || exit 1 ln -s “$1” ${TEMPFILE}.ts

    ffmpeg -i ${TEMPFILE}.ts -acodec copy -absf aac_adtstoasc -threads 0 -deinterlace -s hd720  -aspect 16:9 -r 29.97 -vcodec libx264 -g 300 -b 1600000 -f mp4 ${TEMPFILE}.m4v

    mv -v ${TEMPFILE}.m4v "$1.m4v"
    rm ${TEMPFILE}*

else echo “skpping $1” fi

/tmp/stop_enc というダミーファイルを作っておくと、エンコードをやめます。 深夜にバッチで、 ls ~/TVrec//bin/date -v-1d +%Y-%m-%d*.ts | sed ’s/^/ts2mp4.sh “/g’ | sed ’s/$/"/g’ | sh みたいなことをやって流しているので、朝まで終わらなかったら適当なところできるためにこんな仕掛けを入れています。 ときどきうまく変換できなかったり、MXみたいに複数ストリームが含まれている場合は、事前に TsSplitter.exe を -SEP オプションつけて wine 上で動かして分割してから処理しています。

あとはサーバにPT2突っ込んで録画も FreeBSD 鯖で行えるようにしたいけど、いつになることやら。

タグ: FreeBSD PT2 Ffmpeg