Macでニコニコ動画:H.264 MPEG4にエンコード

Macニコニコ動画にアップするために、H.264のMPEG4に動画をエンコードする方法を紹介します。OS以外は全てフリーソフトを使います。手順はシンプルです。

  1. MacPorts をインストール
  2. ffmpeg をインストール
  3. 動画をエンコード

MacPorts をインストール

The MacPorts Project -- Home から MacPorts をインストールします。

ffmpeg をインストール

MacPorts が提供する ffmpeg をインストールします。以下のコマンドで一発です。

sudo port install ffmpeg

ffmpeg には開発版の ffmpeg-devel もありますが、ffmpeg で十分です。

動画をエンコード

つぎのようなシェルコマンドを作ります。

#! /bin/sh

TMPDIR=`dirname $1`
FFMPEG=/opt/local/bin/ffmpeg
LOG=$TMPDIR/passlog$$
export DYLD_BIND_AT_LAUNCH=1

FIN=$1
if [ ! -f $FIN ] ; then  echo "No such a file: $FIN" ; fi

FOUT="`echo $FIN | cut -f 1 -d .`.mp4"

FPS=
if [ $FPS ] ; then FPS="-r $FPS" ; fi

# 映像のビットレート
BPS=150k

# オーディオのビットレート
AUDIOBITRATE=80k

# 画像サイズ
RESOLUTION=512x384
#CROP="-cropleft 8 -cropright 8"

# 音声ボリューム
VOL=
if [ $VOL ] ; then VOL="-vol $VOL" ; fi

# 音声サンプルレート
AR=
if [ $AR ] ; then AR="-ar $AR" ; fi

echo "encoding: $FIN  ===> $FOUT"

QOPT="-qcomp 0.7 -qmin 20 -qmax 41 -qdiff 10"

$FFMPEG -y -i $FIN -pass 1 -passlogfile $LOG -vcodec libx264 -level 30 -b $BPS $FPS \
    $QOPT -me_method umh -subq 7 -trellis 2 -coder ac -g 250 -bf 3 \
    -b_strategy 1 -directpred 2 -partitions parti4x4+partp8x8+partb8x8 \
    $CROP -sws_flags lanczos -s $RESOLUTION \
    -me_range 32 -sc_threshold 50 -flags loop \
    -cmp chroma -refs 5 -acodec libfaac -ab $AUDIOBITRATE $VOL $AR -async 100 \
    -threads 0 $FOUT

$FFMPEG -y -i $FIN -pass 2 -passlogfile $LOG -vcodec libx264 -level 30 -b $BPS \
    $QOPT -me_method umh -subq 7 -trellis 2 -coder ac -g 250 -bf 3 \
    -b_strategy 1 -directpred 2 -partitions parti4x4+partp8x8+partb8x8 \
    $CROP -sws_flags lanczos -s $RESOLUTION \
    -me_range 32 -sc_threshold 50 -flags loop \
    -cmp chroma -refs 5 -acodec libfaac -ab $AUDIOBITRATE $VOL $AR -async 100 \
    -threads 0 $FOUT

/bin/rm -f ${LOG}*
/bin/rm x264_2pass.log
exit 0

この shell コマンドをたとえば h264encode.sh とすると、

./h264encode.sh movie.mov

とすると、movie.mp4 が吐き出されます。音声はAACになります。

ffmpegHE-AAC v2 のデコーダをサポートしていますが、エンコーダは未サポートのようです。まぁ、このあたりは時間が解決するでしょう。