mkvをmp4に変換するバッチスクリプト

mkv2mp4_flac1

よく使う割には手順が多くて面倒なのでバッチを作った。

h.264 + FLACなmkvファイルをmp4に変換する。
中身のFLACファイルはmp4には入らないので、AACに変換。
可変フレームレート対応。

使い方など
mkv2mp4_flac1 -v 0 -a 1 file.mkv [file2.mkv] [file3.mkv] …
事前に、ファイルのトラック番号をffmpegなどで調べる。
-v <ビデオトラックID> -a <オーディオトラックID>
ファイルは指定しただけ処理される。

#!/bin/sh

## (h.264 + Flac).mkv => (h.264 + aac).mp4
## supports Variable frame rate
##
## Required applications
##   tc2mp4.pl
##   mp4box (GPAC)
##   mkvextract (mkvtoolnix)
##   neroAacEnc
##   ffmpeg
## Usage
##   mkv2mp4_flac1 -v VIDEO_TID -a AUDIO_TID file [file2] [file3] ...
##

cd $PWD
# command line path
TC2=~/scripts/tc2mp4.pl
MP4BOX=/usr/local/bin/mp4box
MKVEXTRACT=/usr/bin/mkvextract
NEROAACENC=/usr/local/bin/neroAacEnc
FFMPEG=/usr/bin/ffmpeg

# audio quality
AQ="0.66"

# parse args
AID=-1
VID=-1
while getopts a:v: OPT
do
	case $OPT in
		"a" ) AID="$OPTARG" ;;
		"v" ) VID="$OPTARG" ;;
	esac
done

if [ $AID = -1 -o $VID = -1 ]; then
	echo "Usage:"
	echo "mkv2mp4_flac1 -v VIDEO_TID -a AUDIO_TID file [file2] [file3] ..."
	exit 1
fi

shift `expr $OPTIND - 1`

# transcode files
for i in `seq 1 $#`
do
	FILE=$1
	if [ -f "$FILE" ]; then
		NAME=`echo "$FILE" | cut -d. -f1`
		echo "$FILE"

		# extract video, audio
		echo -n "  extract video and audio..."
		$MKVEXTRACT tracks "$FILE" $VID:video.264 $AID:audio.flac > /dev/null
		if [ $? != 0 ]; then
			exit 1
		fi
		echo " done"

		# extract timecodes_v2
		echo -n "  extract timecodes_v2..."
		$MKVEXTRACT timecodes_v2 "$FILE" $VID:timecodes.txt > /dev/null
		if [ $? != 0 ]; then
			exit 1
		fi
		echo " done"

		# transcode audio
		echo -n "  transcoding audio..."
		$FFMPEG -y -loglevel fatal -i audio.flac -acodec pcm_s16le -ac 2 -ar 48000 audio.wav &&
		$NEROAACENC -if audio.wav -of audio.aac -lc -q $AQ > /dev/null 2>&1
		if [ $? != 0 ]; then
			exit 1
		fi
		echo " done"

		# video to container
		echo -n "  pre muxing video to container..."
		$MP4BOX -quiet -add video.264 -fps 29.970030 -new cfr.mp4 > /dev/null 2>&1
		if [ $? != 0 ]; then
			exit 1
		fi
		echo " done"
		
		# mux timecodes
		echo -n "  apply timecodes to video..."
		$TC2 -i cfr.mp4 -t timecodes.txt -o vfr.mp4 > /dev/null 2>&1
		if [ $? != 0 ]; then
			exit 1
		fi
		echo " done"
		
		# mux video, audio
		echo -n "  muxing video and audio..."
		$MP4BOX -quiet -add vfr.mp4 -add audio.aac -lang jpn -new "$NAME".mp4 > /dev/null 2>&1 &&
		rm video.264 cfr.mp4 vfr.mp4 timecodes.txt audio.flac audio.wav audio.aac
		echo " done"
	fi
	shift
done
exit 0

コメントを残す