OpenGL/ALSA環境向けキャプチャツールglcの(H.264+AAC).mp4向けエンコード支援スクリプトを作成
(2010/1/7)本記事のスクリプトの改善バージョンを「OpenGL/ALSA環境向けキャプチャツールglcの(H.264+AAC).mp4向けエンコード支援スクリプトを更新(2010/1/6版)」に公開している。
「OpenGLアプリケーションが快適にキャプチャできるglcについて(キャプチャ、再生、エンコード)」では(公式のエンコード支援スクリプトではなく)手動で変換/エンコード作業を行って「(H.264+AAC).mp4」の形式の動画ファイルを作成する流れを扱っているのだが、この流れを「zoomeとSMILEVIDEOへアップロードする動画のエンコードに関する追加メモ(2009/8/28現在)」のエンコード支援スクリプトのように自動化するためのシェルスクリプトを作成した。
注意点については「zoomeとSMILEVIDEOへアップロードする動画のエンコードに関する追加メモ(2009/8/28現在)」の「色々な注意点」と同様で、こちらも、おかしい部分が残っている可能性がある。
SMILEVIDEO向け
既定の設定ではとしたが、動画の長さや用途など、必要に応じて値はオプション指定で調整する。
[任意]ファイル名: glc2mp4-smilevideo.sh ライセンス: GPL-3
#! /bin/bash # glc -> (H.264 + AAC).mp4 convert/encode script # version 20091001 # (C) 2009 kakurasan # Licensed under GPL-3 PATH=/bin:/usr/bin STREAM_AUDIO=1 STREAM_VIDEO=1 BITRATE_AUDIO=96 BITRATE_VIDEO=512 FPS=30 TMP_VIDEO=video.264 TMP_AUDIO_AAC=audio.aac TMP_AUDIO_WAV=audio.wav OUTFILE=glc2mp4-output.mp4 PASSLOGFILE=2pass.log print_usage() { printf "Usage: %s ( [OPTIONS...] ) INPUT -a NUM use audio stream NUM -b BITRATE use BITRATE for audio (default: %s) -c WIDTH:HEIGHT scale to WIDTHxHEIGHT -f FPS set frame rate to FPS (default: %s) -h print help -i BITRATE use BITRATE for video (default: %s) -o video only -t DURATION set DURATION(hh:mm:ss) -v NUM use video stream NUM -x OPTION... set extra x264 options " ${0} ${BITRATE_AUDIO} ${FPS} ${BITRATE_VIDEO} } SCALE=0 USE_X264_EXTRA_OPTS=0 SET_DURATION=0 VIDEOONLY=0 while getopts 'a:b:c:f:hi:ot:v:x:' OPT do case ${OPT} in a) STREAM_AUDIO=${OPTARG} ;; b) BITRATE_AUDIO=${OPTARG} ;; c) SCALE=1 SIZE=${OPTARG} ;; f) FPS=${OPTARG} ;; i) BITRATE_VIDEO=${OPTARG} ;; o) VIDEOONLY=1 ;; t) SET_DURATION=1 DURATION=${OPTARG} ;; v) STREAM_VIDEO=${OPTARG} ;; x) USE_X264_EXTRA_OPTS=1 X264_EXTRA_OPTS=${OPTARG} ;; ?) print_usage exit 1 ;; esac done shift $((${OPTIND} - 1)) if [ ${#} -lt 1 ]; then print_usage exit 1 fi INFILE=${1} if [ ! -f ${INFILE} ]; then echo "input file \"${INFILE}\" not found." exit 1 fi TMPDIR=$(mktemp -d glc2mp4.XXXXXXXX) if [ ${?} -ne 0 ]; then echo "cannot create tempdir" exit 1 fi INFILE=$(cd $(dirname ${INFILE}) && pwd)/$(basename ${INFILE}) cd ${TMPDIR} X264OPTS="bitrate=${BITRATE_VIDEO}:bframes=4:b_pyramid:me=umh:weight_b:frameref=6:nofast_pskip:nodct_decimate" if [ ${USE_X264_EXTRA_OPTS} -eq 1 ]; then X264OPTS=${X264OPTS}:${X264_EXTRA_OPTS} fi GLCPLAY="glc-play" MENCODER="mencoder" FFMPEG="ffmpeg" MP4BOX="MP4Box" if [ ${SET_DURATION} -eq 1 ]; then MENCODER="${MENCODER} -endpos ${DURATION}" FFMPEG="ffmpeg -t ${DURATION}" fi if [ ${SCALE} -eq 1 ]; then VFOPTS="scale=${SIZE},harddup" else VFOPTS="harddup" fi MENCODEROPT_COMMON="-passlogfile ${PASSLOGFILE} -demuxer y4m -nosound -ovc x264 -vf ${VFOPTS} -ofps ${FPS}" CMD_VIDEO_CONV="${GLCPLAY} ${INFILE} -o - -y ${STREAM_VIDEO}" CMD_VIDEO1="${MENCODER} ${MENCODEROPT_COMMON} -x264encopts ${X264OPTS}:pass=1:turbo=1 - -of rawvideo -o /dev/null" CMD_VIDEO2="${MENCODER} ${MENCODEROPT_COMMON} -x264encopts ${X264OPTS}:pass=2:subq=7 - -of rawvideo -o ${TMP_VIDEO}" CMD_AUDIO_CONV="${GLCPLAY} -a ${STREAM_AUDIO} ${INFILE} -o ${TMP_AUDIO_WAV}" CMD_AUDIO_ENC="${FFMPEG} -i ${TMP_AUDIO_WAV} -y -vn -acodec libfaac -ab ${BITRATE_AUDIO}k ${TMP_AUDIO_AAC}" exec 3> >(zenity --notification --listen ${ICON:+--window-icon }${ICON:-}) echo "tooltip: ${CMD_VIDEO_CONV} | ${CMD_VIDEO1}" >&3 ${CMD_VIDEO_CONV} | ${CMD_VIDEO1} || exit 1 echo "message: video pass 1 / 2 done" >&3 echo "tooltip: ${CMD_VIDEO_CONV} | ${CMD_VIDEO2}" >&3 ${CMD_VIDEO_CONV} | ${CMD_VIDEO2} || exit 1 echo "message: video: pass 2 / 2 done" >&3 if [ ${VIDEOONLY} -eq 0 ]; then echo "tooltip: ${CMD_AUDIO_CONV}" >&3 ${CMD_AUDIO_CONV} || exit 1 if [ ! -f ${TMP_AUDIO_WAV} ]; then echo "audio not found" exit 1 fi echo "tooltip: ${CMD_AUDIO_ENC}" >&3 ${CMD_AUDIO_ENC} || exit 1 echo "message: audio: done" >&3 ${MP4BOX} -fps ${FPS} -add ${TMP_VIDEO} -add ${TMP_AUDIO_AAC} -new ../${OUTFILE} else ${MP4BOX} -fps ${FPS} -add ${TMP_VIDEO} -new ../${OUTFILE} fi echo "message: mp4: done" >&3 cd .. rm ${TMPDIR} -fr
zoome向け
既定の設定ではとしたが、映像ビットレートが高くなりすぎないように注意。
[任意]ファイル名: glc2mp4-zoome.sh ライセンス: GPL-3
#! /bin/bash # glc -> (H.264 + AAC).mp4 convert/encode script # version 20091001 # (C) 2009 kakurasan # Licensed under GPL-3 PATH=/bin:/usr/bin STREAM_AUDIO=1 STREAM_VIDEO=1 BITRATE_AUDIO=128 BITRATE_VIDEO=1344 FPS=30 TMP_VIDEO=video.264 TMP_AUDIO_AAC=audio.aac TMP_AUDIO_WAV=audio.wav OUTFILE=glc2mp4-output.mp4 PASSLOGFILE=2pass.log print_usage() { printf "Usage: %s ( [OPTIONS...] ) INPUT -a NUM use audio stream NUM -b BITRATE use BITRATE for audio (default: %s) -c WIDTH:HEIGHT scale to WIDTHxHEIGHT -f FPS set frame rate to FPS (default: %s) -h print help -i BITRATE use BITRATE for video (default: %s) -o video only -t DURATION set DURATION(hh:mm:ss) -v NUM use video stream NUM -x OPTION... set extra x264 options " ${0} ${BITRATE_AUDIO} ${FPS} ${BITRATE_VIDEO} } SCALE=0 USE_X264_EXTRA_OPTS=0 SET_DURATION=0 VIDEOONLY=0 while getopts 'a:b:c:f:hi:ot:v:x:' OPT do case ${OPT} in a) STREAM_AUDIO=${OPTARG} ;; b) BITRATE_AUDIO=${OPTARG} ;; c) SCALE=1 SIZE=${OPTARG} ;; f) FPS=${OPTARG} ;; i) BITRATE_VIDEO=${OPTARG} ;; o) VIDEOONLY=1 ;; t) SET_DURATION=1 DURATION=${OPTARG} ;; v) STREAM_VIDEO=${OPTARG} ;; x) USE_X264_EXTRA_OPTS=1 X264_EXTRA_OPTS=${OPTARG} ;; ?) print_usage exit 1 ;; esac done shift $((${OPTIND} - 1)) if [ ${#} -lt 1 ]; then print_usage exit 1 fi INFILE=${1} if [ ! -f ${INFILE} ]; then echo "input file \"${INFILE}\" not found." exit 1 fi TMPDIR=$(mktemp -d glc2mp4.XXXXXXXX) if [ ${?} -ne 0 ]; then echo "cannot create tempdir" exit 1 fi INFILE=$(cd $(dirname ${INFILE}) && pwd)/$(basename ${INFILE}) cd ${TMPDIR} X264OPTS="bitrate=${BITRATE_VIDEO}:bframes=4:b_pyramid:me=umh:weight_b:frameref=6:nofast_pskip:nodct_decimate" if [ ${USE_X264_EXTRA_OPTS} -eq 1 ]; then X264OPTS=${X264OPTS}:${X264_EXTRA_OPTS} fi GLCPLAY="glc-play" MENCODER="mencoder" FFMPEG="ffmpeg" MP4BOX="MP4Box" if [ ${SET_DURATION} -eq 1 ]; then MENCODER="${MENCODER} -endpos ${DURATION}" FFMPEG="ffmpeg -t ${DURATION}" fi if [ ${SCALE} -eq 1 ]; then VFOPTS="scale=${SIZE},harddup" else VFOPTS="harddup" fi MENCODEROPT_COMMON="-passlogfile ${PASSLOGFILE} -demuxer y4m -nosound -ovc x264 -vf ${VFOPTS} -ofps ${FPS}" CMD_VIDEO_CONV="${GLCPLAY} ${INFILE} -o - -y ${STREAM_VIDEO}" CMD_VIDEO1="${MENCODER} ${MENCODEROPT_COMMON} -x264encopts ${X264OPTS}:pass=1:turbo=1 - -of rawvideo -o /dev/null" CMD_VIDEO2="${MENCODER} ${MENCODEROPT_COMMON} -x264encopts ${X264OPTS}:pass=2:subq=7 - -of rawvideo -o ${TMP_VIDEO}" CMD_AUDIO_CONV="${GLCPLAY} -a ${STREAM_AUDIO} ${INFILE} -o ${TMP_AUDIO_WAV}" CMD_AUDIO_ENC="${FFMPEG} -i ${TMP_AUDIO_WAV} -y -vn -acodec libfaac -ab ${BITRATE_AUDIO}k ${TMP_AUDIO_AAC}" exec 3> >(zenity --notification --listen ${ICON:+--window-icon }${ICON:-}) echo "tooltip: ${CMD_VIDEO_CONV} | ${CMD_VIDEO1}" >&3 ${CMD_VIDEO_CONV} | ${CMD_VIDEO1} || exit 1 echo "message: video pass 1 / 2 done" >&3 echo "tooltip: ${CMD_VIDEO_CONV} | ${CMD_VIDEO2}" >&3 ${CMD_VIDEO_CONV} | ${CMD_VIDEO2} || exit 1 echo "message: video: pass 2 / 2 done" >&3 if [ ${VIDEOONLY} -eq 0 ]; then echo "tooltip: ${CMD_AUDIO_CONV}" >&3 ${CMD_AUDIO_CONV} || exit 1 if [ ! -f ${TMP_AUDIO_WAV} ]; then echo "audio not found" exit 1 fi echo "tooltip: ${CMD_AUDIO_ENC}" >&3 ${CMD_AUDIO_ENC} || exit 1 echo "message: audio: done" >&3 ${MP4BOX} -fps ${FPS} -add ${TMP_VIDEO} -add ${TMP_AUDIO_AAC} -new ../${OUTFILE} else ${MP4BOX} -fps ${FPS} -add ${TMP_VIDEO} -new ../${OUTFILE} fi echo "message: mp4: done" >&3 cd .. rm ${TMPDIR} -fr
使用したバージョン:
- glc 0.5.8