はじめに  †
- どうしても 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