はじめに †
- どうしても Fedora13 ffmpeg でエンコードするとノイズが載ってしまう
- 特に無音状態から会話が始まると、スチールたわしがこすれるようなノイズが入る
- ということで、新手の HandBrake? を試してみる
インストール †
定時実行する †
- /etc/cron.daily/ に toH264.sh を作成して一日一回動くようにする
- /var/video/src にある元データ(多くは HDD レコーダーからコピーしたモノ)をエンコードする
- エンコード先は、/var/video/h264
- 元ファイルは、/var/video/original に退避する
- HandBrake?で、MPEG2 → MPEG4(H264) 変換をすると、音声が途切れる場合がある→ ffmpeg でいったん無圧縮にすることで回避できる
- -vcodec copy -acodec pcm_s16le がミソ
- vcodec に rawvideo とかすると 1時間で 100GB 近い動画になる
- pcm_s16le : 16bit PCM 音声
#!/bin/bash
LC_ALL=en_US.UTF-8
export LC_ALL
SOURCE_DIR="/var/video/src"
BACKUP_DIR="/var/video/original"
DEST_DIR="/var/video/h264"
# 1.) ロックファイルの存在チェック(2重起動の抑止)
LOCK_FILE="/tmp/toH264.lock"
if [ -f $LOCK_FILE ]; then
PID=`cat $LOCK_FILE`
PS_ENTRY=`ps -ae | grep $PID`
echo $PS_ENTRY
if [ -n "$PS_ENTRY" ]; then
echo "Running. Terminate to start encoding."
echo `date`" This process is running." >> /var/log/toh264.log
exit
fi
echo "Not Runnig. Delete lock file and start encoding."
rm $LOCK_FILE
fi
# 2.) 処理対象が存在しない場合終了する
declare -i CNT
CNT=`find $SOURCE_DIR -type f | wc -l`
if [ $CNT -eq 0 ]
then
echo `date`" There is no movie file." >> /var/log/toh264.log
exit
fi
echo $$ > $LOCK_FILE
# ---------- MAIN PROCEDURE ----------
cd $SOURCE_DIR
# -- (ad-hoc) Convert Music File
ls | grep ".*WMA$" | while read line
do
/usr/bin/ffmpeg -y -i $line -acodec libmp3lame -vn -ab 128k /var/video/mp3/${line%.WMA}.mp3 < /dev/null
mv $line /var/video/original
done
for SOURCE_FILE in *
do
echo "-------------------------"
# 1) Analyze source aspect ratio
echo "SOURCE FILE : "$SOURCE_FILE
ASPECT_RATIO=`/usr/bin/mediainfo "$SOURCE_FILE" | grep aspect | cut -c 36-`
echo "SOURCE ASPECT : "$ASPECT_RATIO
# 2) Decide dest resolution
# 16:9 -> 960x544
# 4:3 or unknown -> 960x720
WIDTH="960"
HEIGHT="720"
if [ $ASPECT_RATIO = "16:9" ]; then
WIDTH="960"
HEIGHT="544"
fi
if [ $ASPECT_RATIO = "2.35:1" ]; then
WIDTH="960"
HEIGHT="544"
fi
echo "DEST RESOLUTION : "$WIDTH"x"$HEIGHT
# 3) Convert to Raw Format
if [ -f /tmp/tmp.avi ]
then
rm -f /tmp/tmp.avi
fi
/usr/bin/ffmpeg -i "$SOURCE_FILE" -vcodec copy -acodec pcm_s16le /tmp/tmp.avi
# 4) Convert to H.264
DEST_FILE=${SOURCE_FILE%.*}
DEST_FILE=${DEST_FILE//\#/_}
DEST_FILE=${DEST_FILE// /}
DEST_FILE=$DEST_FILE".mp4"
echo `date`" START ENCODE: $DEST_FILE($WIDTHx$HEIGHT)" >> /var/log/toh264.log
if [ -f "$DEST_DIR/$DEST_FILE" ]
then
rm -f "$DEST_DIR/$DEST_FILE"
fi
/usr/bin/HandBrakeCLI -i /tmp/tmp.avi -o "$DEST_DIR/$DEST_FILE"\
--preset="iPhone 4" -2 -T -w $WIDTH -l $HEIGHT --crop 0:0:0:0
echo `date`" END" >> /var/log/toh264.log
# 5) Reserve original file and delete tmp file
rm /tmp/tmp.avi
mv "$SOURCE_FILE" "$BACKUP_DIR"
done
# ---------- MAIN PROCEDURE ----------
rm $LOCK_FILE
敵は "LC_ALL" にあり †
- 元動画のアスペクト比を解析するのに使っている mediainfo がうまく動かない
- ssh でログインして動かすときちんと動画の解析をしてくれる
- at や batch でスケジューリングしても OK
- ところが、cron で動かすと解析してくれない
- どうやら mediainfo は、環境変数 LC_ALL (LANG) が設定されていないと上手く動かないようだ。とりあえす LC_ALL=en_US.UTF-8 を設定。
変換結果 †
- なかなか良い感じ、さすがに拡大するとブロックノイズが出るけど、そのまま iPod で見るなら HD 画質。ffmpeg でエンコードしたときのような音声のノイズも無し。
- 4:3、16:9 のどちらも iPod nano G4 で再生できる
Fedora 13 Server