YouTube に再エンコードされない FLV ファイルを作るシェル・スクリプト (汎用)
2008-03-21 追記
改良した
YouTube でも余命短い FLV だけど、ついでなんで "ニコニコ動画の FLV ファイルを音質劣化なしで YouTube 用 FLV ファイルに変換するシェル・スクリプト - だらりな。" のシェル・スクリプトを汎用化した。
- 音声もエンコードできるようにして、ニコニコ動画の FLV ファイルなど、音声が MP3 の動画ファイル以外でも FLV に変換できるようにした。
- FFmpeg でパッドのサイズも偶数じゃないといけないのに気づき、そうなるように修正した。
- 画質が良くなる (らしい) エンコード・オプションを追加した (しかし、これのおかげでエンコード時間は激延び)。
マルチ・パス・エンコーディングするのは映像だけだから、音声のエンコードは最後のパスだけでいいんだけど、まあいいかなと思って毎回やってる。
ところで、うちの MEncoder (Debian 非公式パッケージ 1:1.0.rc2svn20071207-0.3) は AVI ファイルの音声をリサンプリングしようとすると (?)、"Blocktype == 0 and window-switching == 1 not allowed." とかいうエラーを何度も吐いたすえに "セグメンテーション違反です" といって落ちる感じ。FFmpeg だとだいじょうぶだけど。
エンコード例
ちょっと AMV を試してみた。Tsukin "Bittersweet Desire"。"コゼットの肖像" 使いで、音楽は Vast の "Pretty When You Cry" って曲らしい。なにもこんな低ビットレート向きじゃない動画で試すことはないのだけど、好きなので……。
まず、このシェル・スクリプトを使ってエンコードしたもの。
作者 (編集者) 本人が YouTube おまかせエンコードで公開してるもの (しばらくすると H.264 + AAC になって、キレイになっちゃってるかもしれない)。
上の、このシェル・スクリプトを使ってエンコードしたほうは、ブロック・ノイズを抑えるために解像度を 160 x 120 にしてしまった。ほとんど音声のことしか考えずにエンコードしてるときは気にしなかったのだけど、映像を気にしてみると、ブロック・ノイズが出てるよりはぼやけてるほうがいいと思ったので。解像度を思いきって落としたおかげで、YouTube おまかせエンコードよりは見れるものになったと思う。
FPS も落とそうと思ったのだけど、映像と音声のシンクロに命かけてる AMV でそれをやると残念な結果になってしまったので、やめておいた。うまい方法もあるのかもしれないけど。
音声は 80 kbps。実はこのビットレートは厳しい。同じ "コゼットの肖像" 使いの SenshiMamoru "Darkglow" (曲は Mute Math の "Chaos") をエンコードしてみたら、80 kbps だとノイズが入ってしまった (2008-03-21 追記: 元動画ファイルの音声にノイズが入ってて、それが増幅されちゃうみたい)。他に、これも大好きな、"Animatrix" 使いの Ileia "Don't Break" (曲は Venus Hum の "Do You Want to Fight Me?") をエンコードしてみたときも、音がおかしくなった。
ついでにもうひとつ。エンコード条件は "Bittersweet Desire" と同じ。
余命短いシェル・スクリプト
#! /bin/sh # # anyvideo2youtube.sh # # Encode any video to youtube.flv. MSG_PREFIX="[anyvideo2youtube] " identify () { mplayer -vo null -ao null -frames 0 -identify "$1" 2> /dev/null | awk '/^=+$/ { exit; } /^ID_/ { print; }' } INPUT_FILE=`echo $1 | sed -e 's/"/\\"/g' -e 's/!/\\!/g'` [ ! -r "${INPUT_FILE}" ] && { echo "${MSG_PREFIX}ERROR: Can't read \"${INPUT_FILE}\"." >&2; exit 1; } echo "${MSG_PREFIX}INPUT_FILE: ${INPUT_FILE}" identify "${INPUT_FILE}" INPUT_AUDIO_FILE=`echo "${INPUT_FILE}" | sed "s/\w\+$/mp3/"` if [ -r "${INPUT_AUDIO_FILE}" ]; then echo "${MSG_PREFIX}INPUT_AUDIO_FILE: ${INPUT_AUDIO_FILE}" identify "${INPUT_AUDIO_FILE}" else INPUT_AUDIO_FILE="${INPUT_FILE}" fi OUTPUT_FILE=`basename "${INPUT_FILE}" | sed "s/\w\+$/forYouTube.flv/"` #[ -f "${OUTPUT_FILE}" ] && {echo "${MSG_PREFIX}ERROR: \"${OUTPUT_FILE}\" already exists." >&2; exit 1; } #CONF_FILE=${HOME}/.anyvideo2youtube.conf CONF_FILE=${HOME}/bin/anyvideo2youtube.conf [ ! -r ${CONF_FILE} ] && { echo "${MSG_PREFIX}ERROR: Can't read \"${CONF_FILE}\"." >&2; exit 1; } source ${CONF_FILE} [ ! ${ENCODER} -o ${ENCODER} != "FFMPEG" ] && ENCODER=MENCODER echo "${MSG_PREFIX}ENCODER: ${ENCODER}" [ ! ${TOTAL_BITRATE} ] && { echo "${MSG_PREFIX}ERROR: Please set TOTAL_BITRATE." >&2; exit 1; } [ ! ${AUDIO_BITRATE} ] && { echo "${MSG_PREFIX}ERROR: Please set AUDIO_BITRATE." >&2; exit 1; } # # Probe # probe () { eval `mplayer -vo null -ao null -frames 0 -identify "$1" 2> /dev/null | awk '/^=+$/ { exit; } { print; }' | grep -e "$2"` } if [ ${AUDIO_BITRATE} = "COPY" ]; then probe "${INPUT_AUDIO_FILE}" "^ID_AUDIO" [ ${ID_AUDIO_FORMAT} != "85" ] && { echo "${MSG_PREFIX}Audio Stream is not MP3."; exit 1; } AUDIO_CODEC="copy" AUDIO_BITRATE=`echo ${ID_AUDIO_BITRATE} | awk '{ print $1 / 1000; }'` else AUDIO_CODEC="re-encode" fi VIDEO_BITRATE=`echo ${TOTAL_BITRATE} ${AUDIO_BITRATE} | awk '{ print int( $1 - $2 ); }'` echo "${MSG_PREFIX}AUDIO_BITRATE: ${AUDIO_BITRATE} (${AUDIO_CODEC}); VIDEO_BITRATE: ${VIDEO_BITRATE}" [ ${VIDEO_BITRATE} -le 0 ] && { echo "${MSG_PREFIX}ERROR: TOTAL_BITRATE is too low." >&2; exit 1; } probe "${INPUT_FILE}" "^ID_LENGTH"; INPUT_FILE_LENGTH=${ID_LENGTH} probe "${INPUT_AUDIO_FILE}" "^ID_LENGTH"; INPUT_AUDIO_FILE_LENGTH=${ID_LENGTH} PROBE_DELAY=`echo ${INPUT_AUDIO_FILE_LENGTH} ${INPUT_FILE_LENGTH} | awk '{ print $1 - $2; }'` [ ${CUSTOM_DELAY} ] && AUTO_DELAY="CUSTOM" [ ! ${AUTO_DELAY} -o ${ENCODER} = "FFMPEG" ] && AUTO_DELAY="NONE" case "${AUTO_DELAY}" in CUSTOM) DELAY=${CUSTOM_DELAY};; FULL) DELAY=${PROBE_DELAY};; HALF) DELAY=`echo ${PROBE_DELAY} | awk '{ print $1 / 2; }'`;; NONE|*) DELAY=0; AUTO_DELAY="NONE";; esac echo "${MSG_PREFIX}PROBE_DELAY: ${PROBE_DELAY}; AUTO_DELAY: ${AUTO_DELAY}; DELAY: ${DELAY}" probe "${INPUT_FILE}" "^ID_VIDEO" [ ${FORCE_ASPECT} ] && { ID_VIDEO_ASPECT=${FORCE_ASPECT}; echo "${MSG_PREFIX}FORCE_ASPECT: ${FORCE_ASPECT}"; } ORIGINAL_WIDTH=${ID_VIDEO_WIDTH} ORIGINAL_HEIGHT=`echo ${ID_VIDEO_ASPECT} ${ID_VIDEO_HEIGHT} ${ID_VIDEO_WIDTH} | awk '{ print ( $1 == 0 ? $2 : $3 / $1 ); }'` echo "${MSG_PREFIX}ORIGINAL_WIDTH: ${ORIGINAL_WIDTH}; ORIGINAL_HEIGHT: ${ORIGINAL_HEIGHT}" [ ! ${AUTO_CROP} ] && AUTO_CROP="OFF" if [ ${AUTO_CROP} = "ON" ]; then echo "${MSG_PREFIX}AUTO_CROP: ${AUTO_CROP}" #CROPDETECT_LIMIT=16 CROPDETECT_LIMIT=24 DETECTED_CROP=`mplayer -benchmark -vo null -nosound -vf cropdetect=${CROPDETECT_LIMIT} "${INPUT_FILE}" 2> /dev/null | \ grep -e "-vf crop" | tail -n 1 | sed -e "s/.*(-vf\ crop=//" -e "s/)\..*//"` VF_CROP="crop=${DETECTED_CROP}," CROPPED_WIDTH=`echo ${DETECTED_CROP} | awk -F : '{ print $1; }'` CROPLEFT=`echo ${DETECTED_CROP} | awk -F : '{ print $3; }'` CROPRIGHT=`expr ${ORIGINAL_WIDTH} - ${CROPPED_WIDTH} - ${CROPLEFT}` CROPPED_HEIGHT=`echo ${DETECTED_CROP} | awk -F : '{ print $2; }'` CROPTOP=`echo ${DETECTED_CROP} | awk -F : '{ print $4; }'` CROPBOTTOM=`expr ${ID_VIDEO_HEIGHT} - ${CROPPED_HEIGHT} - ${CROPTOP}` CROPPED_HEIGHT=`echo ${ID_VIDEO_ASPECT} ${CROPPED_HEIGHT} ${ORIGINAL_HEIGHT} ${ID_VIDEO_HEIGHT} | \ awk '{ print ( $1 == 0 ? $2 : $2 * $3 / $4 ); }'` echo "${MSG_PREFIX}CROPPED_WIDTH: ${CROPPED_WIDTH}; CROPPED_HEIGHT: ${CROPPED_HEIGHT}" else CROPPED_WIDTH=${ORIGINAL_WIDTH} CROPPED_HEIGHT=${ORIGINAL_HEIGHT} fi if [ `echo ${CROPPED_WIDTH} ${CROPPED_HEIGHT} | awk '{ print ( ( $1 / $2 ) >= ( 4 / 3 ) ); }'` -eq 1 ]; then [ ! ${WIDTH} ] && WIDTH=${CROPPED_WIDTH} SCALE_WIDTH=${WIDTH} HEIGHT=`echo ${WIDTH} | awk '{ print int( $1 * 3 / 4 + 0.5 ); }'` SCALE_HEIGHT=`echo ${CROPPED_HEIGHT} ${WIDTH} ${CROPPED_WIDTH} | awk '{ print int( $1 * $2 / $3 + 0.5 ); }'` else if [ ! ${WIDTH} ]; then HEIGHT=`echo ${CROPPED_HEIGHT} | awk '{ print int( $1 + 0.5 ); }'` WIDTH=`echo ${HEIGHT} | awk '{ print int( $1 * 4 / 3 + 0.5 ); }'` else HEIGHT=`echo ${WIDTH} | awk '{ print int( $1 * 3 / 4 + 0.5 ); }'` fi SCALE_HEIGHT=${HEIGHT} SCALE_WIDTH=`echo ${CROPPED_WIDTH} ${HEIGHT} ${CROPPED_HEIGHT} | awk '{ print int( $1 * $2 / $3 + 0.5 ); }'` fi WIDTH=`expr ${WIDTH} + ${WIDTH} % 2` HEIGHT=`expr ${HEIGHT} + ${HEIGHT} % 2` SCALE_WIDTH=`expr ${SCALE_WIDTH} + ${SCALE_WIDTH} % 2` SCALE_HEIGHT=`expr ${SCALE_HEIGHT} + ${SCALE_HEIGHT} % 2` PADTOP=`expr \( ${HEIGHT} - ${SCALE_HEIGHT} \) / 2`; PADTOP=`expr ${PADTOP} - ${PADTOP} % 2` PADBOTTOM=`expr ${HEIGHT} - ${SCALE_HEIGHT} - ${PADTOP}` PADLEFT=`expr \( ${WIDTH} - ${SCALE_WIDTH} \) / 2`; PADLEFT=`expr ${PADLEFT} - ${PADLEFT} % 2` PADRIGHT=`expr ${WIDTH} - ${SCALE_WIDTH} - ${PADLEFT}` echo "${MSG_PREFIX}SCALE_WIDTH: ${SCALE_WIDTH}; SCALE_HEIGHT: ${SCALE_HEIGHT}" echo "${MSG_PREFIX}WIDTH: ${WIDTH}; HEIGHT: ${HEIGHT}" [ ! ${FPS} ] && FPS=${ID_VIDEO_FPS} FPS=`echo ${FPS} ${ID_VIDEO_FPS} | awk '{ print ( $1 == 0 ? $2 : $1 ); }'` FPS=`echo ${FPS} ${ID_VIDEO_FPS} | awk '{ print ( $1 < 0 ? $2 / $1 * -1 : $1 ); }'` FPS=`echo ${FPS} ${ID_VIDEO_FPS} | awk '{ print ( $1 > $2 ? $2 : $1 ); }'` echo "${MSG_PREFIX}FPS: ${FPS}" # # Encode # if [ ${ENCODER} = "MENCODER" ]; then MSGLEVEL="all=1" [ ${AUDIO_CODEC} = "re-encode" ] && AUDIO_CODEC="mp3lame -lameopts preset=${AUDIO_BITRATE}" VF="${VF_CROP}${ADDITIONAL_VF}scale=${SCALE_WIDTH}:${SCALE_HEIGHT},expand=${WIDTH}:${HEIGHT}" #VF="${VF_CROP}${ADDITIONAL_VF}scale=${SCALE_WIDTH}:${SCALE_HEIGHT}" KEYINT=":keyint=`echo ${FPS} | awk '{ print int( $1 * 10 ); }'`" LAVCOPTS="vcodec=flv:vbitrate=${VIDEO_BITRATE}:mbd=2:mv0:trell:v4mv:cbp:last_pred=3:predia=4:dia=4:preme=2${KEYINT}" PASSLOGFILE="anyvideo2youtube-mencoder-`date +%Y%m%d%H%M%S`.log" encode () { mencoder -msglevel ${MSGLEVEL} -of lavf\ -delay ${DELAY} -mc 0 -af resample=44100:0:2 -srate 44100 -oac ${AUDIO_CODEC}\ -vf ${VF} -ofps ${FPS} -ovc lavc -lavcopts ${LAVCOPTS}:vpass=$1 -passlogfile ${PASSLOGFILE}\ -o "${OUTPUT_FILE}" -audiofile "${INPUT_AUDIO_FILE}" "${INPUT_FILE}" ||\ { echo "${MSG_PREFIX}ERROR: MEncoder error occured." >&2; exit 1; } } [ ! ${PASS} -o ${PASS} -lt 2 ] && PASS=2 i=1 while [ ${i} -le ${PASS} ] do echo "${MSG_PREFIX}Encoding \"${INPUT_FILE}\" (pass ${i}/${PASS})." encode `echo ${i} | awk '{ print ( $1 == 1 ? 1 : 3 ); }'` i=`expr ${i} + 1` done rm ${PASSLOGFILE} else [ ${AUDIO_CODEC} = "re-encode" ] && AUDIO_CODEC="libmp3lame -ab `expr ${AUDIO_BITRATE} \* 1000` -ar 44100" CROP="-croptop ${CROPTOP} -cropbottom ${CROPBOTTOM} -cropleft ${CROPLEFT} -cropright ${CROPRIGHT}" PAD="-padtop ${PADTOP} -padbottom ${PADBOTTOM} -padleft ${PADLEFT} -padright ${PADRIGHT}" VIDEO_BITRATE=`expr ${VIDEO_BITRATE} \* 1000` VIDEO_OPTIONS="-mbd 2 -mv0 -trell -last_pred 3 -pre_dia_size 4 -dia_size 4 -preme 2" PASSLOGFILE="anyvideo2youtube-ffmpeg-`date +%Y%m%d%H%M%S`" encode () { ffmpeg -y -i "${INPUT_AUDIO_FILE}" -i "${INPUT_FILE}"\ -acodec ${AUDIO_CODEC} -pass $1 -passlogfile ${PASSLOGFILE}\ ${CROP} -s ${SCALE_WIDTH}x${SCALE_HEIGHT} ${PAD} -r ${FPS} -vcodec flv -b ${VIDEO_BITRATE} ${VIDEO_OPTIONS}\ "${OUTPUT_FILE}" || { echo "${MSG_PREFIX}ERROR: FFmpeg error occured." >&2; exit 1; } } echo "${MSG_PREFIX}Encoding \"${INPUT_FILE}\" (pass 1/2)" encode 1 echo "${MSG_PREFIX}Encoding \"${INPUT_FILE}\" (pass 2/2)" encode 2 rm ${PASSLOGFILE}*.log fi echo "OUTPUT_FILE: ${OUTPUT_FILE}" identify "${OUTPUT_FILE}" OUTPUT_FILE_SIZE=`ls -l "${OUTPUT_FILE}" | awk '{ print $5; }'` probe "${OUTPUT_FILE}" "^ID_LENGTH" echo "${MSG_PREFIX}TOTAL_BITRATE: `echo ${OUTPUT_FILE_SIZE} ${ID_LENGTH} | awk '{ print ( $1 * 8 / $2 / 1000 ); }'` kbps" exit 0
設定ファイル
# anyvideo2youtube.conf # # anyvideo2youtube.sh の設定ファイル ####### BASIC OPTIONS ####### # # TOTAL_BITRATE # # 音声と映像をあわせての目標ビットレートを、単位 kbps で指定 (必須)。 # YouTube での再エンコードを回避するためには、350 kbps 未満である必要がある模様 (2008 年 3 月現在)。 # 340 にしておくと 350 kbps をちょっと下回るぐらいになることが多い。 # 微調整して 350 kbps 未満になるようにしたりする。 # MEncoder が必要なしと判断した場合は、指定を下回るビットレートになる (不必要に大きなファイルにはならない)。 #TOTAL_BITRATE=468 # 音声が 192 kbps なのに 320 kbps だとか自己申請する動画で音声をコピーするとき #TOTAL_BITRATE=436 # 音声が 128 kbps なのに 224 kbps だとか、160 kbps なのに 256 kbps だとか自己申請する動画で音声をコピーするとき #TOTAL_BITRATE=420 # 音声が 112 kbps なのに 192 kbps だとか自己申請する動画で音声をコピーするとき TOTAL_BITRATE=340 #TOTAL_BITRATE=308 # 音声が 160 kbps なのに 128 kbps だとか、192 kbps なのに 160 kbps だとか自己申請する動画で音声をコピーするとき #TOTAL_BITRATE=276 # 音声が 96 kbps なのに 32 kbps だとか、192 kbps なのに 128 kbps だとか自己申請する動画で音声をコピーするとき #TOTAL_BITRATE=260 # 音声が 112 kbps なのに 32 kbps だとか、192 kbps なのに 112 kbps だとか自己申請する動画で音声をコピーするとき #TOTAL_BITRATE=244 # 音声が 128 kbps なのに 32 kbps だとか、320 kbps なのに 224 kbps だとか自己申請する動画で音声をコピーするとき #TOTAL_BITRATE=212 # 音声が 160 kbps なのに 32 kbps だとか自己申請する動画で音声をコピーするとき #TOTAL_BITRATE=180 # 音声が 192 kbps なのに 32 kbps だとか自己申請する動画で音声をコピーするとき #TOTAL_BITRATE=148 # 音声が 224 kbps なのに 32 kbps だとか、320 kbps なのに 128 kbps だとか自己申請する動画で音声をコピーするとき #TOTAL_BITRATE=116 # 音声が 256 kbps なのに 32 kbps だとか自己申請する動画で音声をコピーするとき #TOTAL_BITRATE=52 # 音声が 320 kbps なのに 32 kbps だとか自己申請する動画で音声をコピーするとき # # AUDIO_BITRATE # # 音声のビットレートを、単位 kbps で指定 (必須)。 # 元動画ファイルの音声をコピーする (エンコードしない) 場合は、"COPY" を指定する。 #AUDIO_BITRATE="COPY" #AUDIO_BITRATE=128 #AUDIO_BITRATE=112 #AUDIO_BITRATE=96 AUDIO_BITRATE=80 #AUDIO_BITRATE=64 # # WIDTH # # 出力する映像の横幅をピクセル数で指定。 # 指定しなかった場合 (すべてコメント・アウトした場合) は、元動画ファイルと同じになる。 #WIDTH=640 #WIDTH=480 #WIDTH=440 #WIDTH=400 #WIDTH=360 #WIDTH=320 #WIDTH=280 #WIDTH=240 #WIDTH=200 WIDTH=160 #WIDTH=120 #WIDTH=80 # # FPS = Frames Per Second # # 1 秒あたり何フレームの映像にするかを指定。 # 指定しなかった場合 (すべてコメント・アウトした場合) や、 # 指定より元動画のほうが FPS が低かった場合は、元動画ファイルと同じになる。 # また、負の値の場合は、元動画ファイルの FPS をその絶対値で割った数値になる。 # たとえば、FPS が 24 である元動画ファイルに対して -2 を指定した場合、12 になる。 #FPS=-5 #FPS=-4 #FPS=-3 #FPS=-2 #FPS=`echo 3 2 | awk '{ print $1 / $2 * -1; }'` # 2/3 にしたいとき用 #FPS=`echo 4 3 | awk '{ print $1 / $2 * -1; }'` # 3/4 にしたいとき用 #FPS=15 #FPS=12 #FPS=10 #FPS=8 #FPS=6 #FPS=5 #FPS=4 #FPS=3 #FPS=2 #FPS=1 # # PASS (ENCODER="MENCODER" の場合のみ有効) # # エンコードのパス数を指定する。 # 指定しなかった場合 (すべてコメント・アウトした場合) は 2 になる。 # ENCODER="FFMPEG" の場合は、強制的に 2 になる。 PASS=3 ####### ADVANCED OPTIONS ####### # # ENCODER # # エンコーダを指定する。 # 指定しなかった場合 (すべてコメント・アウトした場合) や、 # "FFMPEG" 以外の文字列だった場合は "MENCODER" になる。 ENCODER="MENCODER" #ENCODER="FFMPEG" # # AUTO_DELAY (ENCODER="MENCODER" の場合のみ有効) # # 元動画ファイルと、外部の音声ファイルで長さが異なる場合、映像ストリームと音声ストリームを── # はじめで合わせたければ "NONE" を指定。 # 真ん中で合わせたければ "HALF" を指定。 # 終わりで合わせたければ "FULL" を指定。 # ただし、自己申請に頼っているため、あまり信用できないので注意。 # 別の文字列を指定した場合や、指定しなかった場合 (コメント・アウトした場合) は "NONE" になる。 # ENCODER="FFMPEG" の場合は、強制的に "NONE" になる。 AUTO_DELAY="NONE" #AUTO_DELAY="HALF" #AUTO_DELAY="FULL" # # CUSTOM_DELAY (ENCODER="MENCODER" の場合のみ有効) # # DELAY の値を自分で指定する。 # 映像を遅らせたい場合は正の値を指定。 # 音声を遅らせたい場合は負の値を指定。 # これを指定すると AUTO_DELAY の指定は無視される。不要な場合はコメント・アウト。 # ENCODER="FFMPEG" の場合は、強制的に指定なしになる。 #CUSTOM_DELAY=-3.38 # "サイハテ" で使用した値 #CUSTOM_DELAY=-11.80 # "電空少女" で使用した値 # # AUTO_CROP # # 映像周囲の黒枠を自動検出し、消去するかどうかを指定。 # 指定しなかった場合 (コメント・アウトした場合) や、 # "ON" 以外の文字列だった場合は "OFF" になる。 AUTO_CROP="OFF" #AUTO_CROP="ON" # # FORCE_ASPECT # # 元動画のアスペクト比を数値や計算式で強制指定。 # アスペクト比の狂った映像を修正するために使う。 # 不要な場合はコメント・アウト。 #FORCE_ASPECT=`echo 4 3 | awk '{ print ( $1 / $2 ); }'` # 元動画のアスペクト比が、本来 4:3 であるとき用 #FORCE_ASPECT=`echo 16 9 | awk '{ print ( $1 / $2 ); }'` # 元動画のアスペクト比が、本来 16:9 であるとき用 # # ADDITIONAL_VF (ENCODER="MENCODER" の場合のみ有効) # # エンコード時、動画に適用するフィルタを指定。 # 基本的にいじる必要なし。 # ENCODER="FFMPEG" の場合は、この指定の意味はない。 ADDITIONAL_VF="pp=ac," #ADDITIONAL_VF="flip,pp=ac," # 元動画ファイルを MPlayer で再生したとき、映像が上下逆になる場合 #ADDITIONAL_VF="pp=md/ac," # インターレース解除されてない場合