Last active
September 30, 2018 03:50
-
-
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 とか参照。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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