Skip to content

Instantly share code, notes, and snippets.

@dodo5522
Last active September 30, 2018 03:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dodo5522/a29a7e495b53e0548ccdc3da6f51e121 to your computer and use it in GitHub Desktop.
Save dodo5522/a29a7e495b53e0548ccdc3da6f51e121 to your computer and use it in GitHub Desktop.
SONYハンディカムHDR-PJ760等で撮影したAVCHD動画を自動的にチャプタ毎分割しつつ、適当にダウンコンバートしたmp4動画へ変換するbashスクリプト。tsMuxeR, ffmpeg必須。詳細は http://tech.uribou.tokyo/split-avchd-movie-automatically とか参照。
#!/bin/bash
usage_exit() {
echo "Usage: $0 [options] MPL_FILE" 1>&2
echo "" 1>&2
echo "options:" 1>&2
echo " -i input source file" 1>&2
echo " -d destination dir" 1>&2
echo " -r output video resolution (default: 1280x720)" 1>&2
echo " -s output video aspect (default: 16:9)" 1>&2
echo " -f output video fps (default: 29.97)" 1>&2
echo " -v output video codec (default: libx264)" 1>&2
echo " -a output audio codec (default: aac)" 1>&2
echo " -t tsMuxer path" 1>&2
exit 1
}
while getopts i:d:v:r:s:f:a:t: OPT
do
case ${OPT} in
'i' )
FILE_SRC=${OPTARG}
;;
'd' )
DIR_DEST=${OPTARG}
;;
'v' )
TYPE_VIDEO=${OPTARG}
;;
'r' )
RESOLUTION=${OPTARG}
;;
's' )
ASPECT=${OPTARG}
;;
'f' )
FPS=${OPTARG}
;;
'a' )
TYPE_AUDIO=${OPTARG}
;;
't' )
TSMUXER=${OPTARG}
;;
*)
usage_exit
;;
esac
done
TSMUXER=${TSMUXER:-'/usr/bin/tsMuxeR'}
DIR_DEST=${DIR_DEST:-'.'}
RESOLUTION=${RESOLUTION:-'1280x720'}
ASPECT=${ASPECT:-'16:9'}
FPS=${FPS:-'29.97'}
TYPE_VIDEO=${TYPE_VIDEO:-'libx264'}
TYPE_AUDIO=${TYPE_AUDIO:-'aac'}
DIR_TEMP='.mts_parser'
init() {
mkdir -p ${DIR_TEMP}
cd ${DIR_TEMP}
rm -f convert.sh
}
make_mts_info() {
MTS_INFO='mts.info'
${TSMUXER} ${FILE_SRC} | \
grep -E '^(File|Marks).+' | \
perl -pe 's/\n/,/g' | \
perl -pe 's/,File/\nFile/g' | \
perl -pe 's/Marks:\s+(.+)/Marks=$1/g' |
perl -pe 's/^File.+name=(.+)/File=$1/g' |
tr -d ' ' > ${MTS_INFO}
echo '' >> ${MTS_INFO}
echo ${MTS_INFO}
}
make_converter() {
FFMPEG_OPT_BASE="-profile:v baseline -level:v 3.1"
FFMPEG_OPT_VIDEO="-vcodec ${TYPE_VIDEO} -s ${RESOLUTION} -aspect ${ASPECT} -vf fps=${FPS}"
FFMPEG_OPT_AUDIO="-acodec ${TYPE_AUDIO} -strict experimental"
FFMPEG_OPT="${FFMPEG_OPT_BASE} ${FFMPEG_OPT_VIDEO} ${FFMPEG_OPT_AUDIO}"
NUMBER=$(printf '%03d' ${1})
BASE=${FILES[0]}
if [ ${#FILES[@]} -eq 1 ]; then
echo "cp ${BASE} ${DIR_DEST}/${NUMBER}.$(basename ${BASE})" | tee -a convert.sh
echo "ffmpeg -i ${BASE} ${FFMPEG_OPT} ${DIR_DEST}/${NUMBER}.$(basename ${BASE}).mp4" | tee -a convert.sh
else
echo "cat ${FILES[@]} > ${DIR_DEST}/${NUMBER}.$(basename ${BASE})" | tee -a convert.sh
echo "ffmpeg -i ${DIR_DEST}/${NUMBER}.$(basename ${BASE}) ${FFMPEG_OPT} ${DIR_DEST}/${NUMBER}.$(basename ${BASE}).mp4" | tee -a convert.sh
fi
}
init
MTS_INFO=$(make_mts_info)
FILES=()
COUNT=0
LINES=$(wc -l ${MTS_INFO} | cut -d' ' -f1)
cat mts.info | while read LINE
do
let COUNT++
if [[ ${LINE} =~ .*Marks.* ]]; then
if [ ${#FILES[@]} -gt 0 ]; then
make_converter ${COUNT}
fi
FILES=($(echo ${LINE} | cut -d, -f1 | cut -d= -f2))
else
FILES=(${FILES[@]} $(echo ${LINE} | cut -d, -f1 | cut -d= -f2))
if [ ${COUNT} -ge ${LINES} ]; then
make_converter ${COUNT}
fi
fi
done
chmod +x convert.sh
. convert.sh
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment