add a script to convert mkv to mpeg4
This commit is contained in:
parent
c853ed1c7c
commit
45c5dc137c
1 changed files with 112 additions and 0 deletions
112
convert-mkv-to-mp4.sh
Executable file
112
convert-mkv-to-mp4.sh
Executable file
|
|
@ -0,0 +1,112 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# convert-mkv-to-mp4.sh
|
||||
#
|
||||
# Copyright (c) 2014 Don Melton
|
||||
#
|
||||
|
||||
about() {
|
||||
cat <<EOF
|
||||
$program 1.0 of July 9, 2014
|
||||
Copyright (c) 2013-2014 Don Melton
|
||||
EOF
|
||||
exit 0
|
||||
}
|
||||
|
||||
usage() {
|
||||
cat <<EOF
|
||||
Convert Matroska video file into MP4 format without transcoding.
|
||||
|
||||
Usage: $program [OPTION]... [FILE]
|
||||
|
||||
--help display this help and exit
|
||||
--version output version information and exit
|
||||
|
||||
Requires \`ffprobe\`, \`ffmpeg\` and \`mp4track\` executables in \$PATH.
|
||||
Output is written to current working directory.
|
||||
EOF
|
||||
exit 0
|
||||
}
|
||||
|
||||
syntax_error() {
|
||||
echo "$program: $1" >&2
|
||||
echo "Try \`$program --help\` for more information." >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
die() {
|
||||
echo "$program: $1" >&2
|
||||
exit ${2:-1}
|
||||
}
|
||||
|
||||
readonly program="$(basename "$0")"
|
||||
|
||||
case $1 in
|
||||
--help)
|
||||
usage
|
||||
;;
|
||||
--version)
|
||||
about
|
||||
;;
|
||||
esac
|
||||
|
||||
readonly input="$1"
|
||||
|
||||
if [ ! "$input" ]; then
|
||||
syntax_error 'too few arguments'
|
||||
fi
|
||||
|
||||
if [ ! -f "$input" ]; then
|
||||
die "input file not found: $input"
|
||||
fi
|
||||
|
||||
readonly output="$(basename "$input" | sed 's/\.[^.]*$//').mp4"
|
||||
|
||||
if [ -e "$output" ]; then
|
||||
die "output file already exists: $output"
|
||||
fi
|
||||
|
||||
for tool in ffprobe ffmpeg mp4track; do
|
||||
|
||||
if ! $(which $tool >/dev/null); then
|
||||
die "executable not in \$PATH: $tool"
|
||||
fi
|
||||
done
|
||||
|
||||
readonly container="$(ffprobe -show_format "$input" 2>/dev/null | sed -n '/^format_name=/p' | sed 's/^.*=//;s/,.*$//')"
|
||||
|
||||
if [ "$container" != 'matroska' ]; then
|
||||
die "input file not Matroska format: $input"
|
||||
fi
|
||||
|
||||
readonly track1="$(ffprobe -show_streams -select_streams a:0 "$input" 2>/dev/null | sed -n '/^codec_name=/p' | sed 's/^.*=//;s/,.*$//')"
|
||||
readonly track2="$(ffprobe -show_streams -select_streams a:1 "$input" 2>/dev/null | sed -n '/^codec_name=/p' | sed 's/^.*=//;s/,.*$//')"
|
||||
|
||||
adjust_defaults=''
|
||||
|
||||
if [ "$track1" == 'ac3' ] && [ "$track2" == 'aac' ]; then
|
||||
map_options='-map 0:2 -map 0:1'
|
||||
adjust_defaults='true'
|
||||
|
||||
elif [ "$track1" == 'aac' ]; then
|
||||
map_options='-map 0:1'
|
||||
else
|
||||
die "input file does not contain compatible audio tracks: $input"
|
||||
fi
|
||||
|
||||
echo "Converting: $input" >&2
|
||||
|
||||
time {
|
||||
ffmpeg \
|
||||
-i "$input" \
|
||||
-map 0:0 \
|
||||
$map_options \
|
||||
-c copy \
|
||||
"$output" \
|
||||
|| exit 1
|
||||
|
||||
if [ "$adjust_defaults" ]; then
|
||||
mp4track --track-index 1 --enabled true "$output" &&
|
||||
mp4track --track-index 2 --enabled false "$output" || exit 1
|
||||
fi
|
||||
}
|
||||
Loading…
Reference in a new issue