-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathopuspipe
executable file
·83 lines (74 loc) · 3.05 KB
/
opuspipe
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#!/usr/bin/env bash
## This is because I am lazy and I cannot ever remember all the flags to make ffmpeg shut the fuck up and opusenc read from stdin
## It can only do one track, so if you have more than one you have to tell it which one to do
# Check for tool dependencies
SELF_FULLPATH=`realpath ${0}`
SELF_DIR=`dirname ${SELF_FULLPATH}`
# Override default tool list
TOOLS=(ffmpeg opusenc jq base64 bc sed mediainfo column)
# Does not depend on any other scripts
SCRIPTS=NONE
if [ ! -r ${SELF_DIR}/toolchecker ]; then
echo "toolchecker not found."
exit 1
else
. ${SELF_DIR}/toolchecker
fi
if [ -z "${1}" ]; then
echo "No input provided."
echo "${0} input_file output_file [track num]"
exit 1
fi
if [ -z "${2}" ]; then
echo "No output provided."
echo "${0} input_file output_file [track num]"
exit 1
fi
INPUT="${1}"
OUTPUT="${2}"
if [ -z "${3}" ]; then
TRACKNUM=0
else
case ${3} in
''|*[!0-9]*)
echo "Track number should be a number"
exit 1;;
*)
TRACKNUM=${3};;
esac
fi
MITRACKNUM=`echo ${TRACKNUM} + 1 | bc`
NL=$'\n'
TRACK=`${MEDIAINFO} --output=JSON "${INPUT}" | ${JQ} -r ".media.track[${MITRACKNUM}] | @base64"`
TRACK_TYPE=`echo "${TRACK}" | ${BASE64} --decode | ${JQ} -r '.["@type"]'`
TRACK_NUMBER=`echo "${TRACK}" | ${BASE64} --decode | ${JQ} -r '.StreamOrder'`
TRACK_CODEC=`echo "${TRACK}" | ${BASE64} --decode | ${JQ} -r '.CodecID'`
TRACK_BITRATE=`echo "${TRACK}" | ${BASE64} --decode | ${JQ} -r '.BitRate'`
TRACK_LAYOUT=`echo "${TRACK}" | ${BASE64} --decode | ${JQ} -r '.ChannelLayout'`
[ "${TRACK_LAYOUT}" == null ] && TRACK_LAYOUT=`echo "${TRACK}" | ${BASE64} --decode | ${JQ} -r '.ChannelLayout_Original'`
TRACK_CHANNELS=`echo "${TRACK}" | ${BASE64} --decode | ${JQ} -r '.Channels'`
TRACK_CHANNELS_ORIGINAL=`echo "${TRACK}" | ${BASE64} --decode | ${JQ} -r '.Channels_Original'`
[ "${TRACK_CHANNELS_ORIGINAL}" != null ] && TRACK_CHANNELS=${TRACK_CHANNELS_ORIGINAL}
TRACK_COMPMODE=`echo "${TRACK}" | ${BASE64} --decode | ${JQ} -r '.Compression_Mode'`
TRACK_FORMAT=`echo "${TRACK}" | ${BASE64} --decode | ${JQ} -r '.Format'`
TRACK_META="${TRACK_NUMBER},${TRACK_CODEC},${TRACK_BITRATE},${TRACK_CHANNELS},${TRACK_LAYOUT},${TRACK_FORMAT},${TRACK_COMPMODE}${NL}"
if [ ! "${TRACK_TYPE}" == "Audio" ]; then
echo "Track ${TRACKNUM} is not an audio track"
echo ${TRACK} | ${BASE64} --decode | ${JQ}
exit 1
fi
echo
echo "Input Audio Track"
echo "------------------"
echo "Track,Codec,BitRate,Channels,Layout,Format,CompMode${NL}${TRACK_META}" | ${COLUMN} -t -s, -o " | "
echo
BR=$(echo "${TRACK_LAYOUT}" | ${SED} -e 's~Rss\|Lss\|Rb\|Lb\|Rs\|Ls\|LFE~64~g' -e 's~M\|Cb\|C\|L\|R~128~g' -e 's~\ ~\+~g' | ${BC})
OUTPUT_TRACK_META="opus,${BR}k,${TRACK_CHANNELS},${TRACK_LAYOUT}${NL}"
echo
echo "Output Audio Track"
echo "------------------"
echo "Codec,BitRate,Channels,Layout${NL}${OUTPUT_TRACK_META}" | ${COLUMN} -t -s, -o " | "
echo
set -x
${FFMPEG} -hide_banner -loglevel error -i "${INPUT}" -map 0:${TRACKNUM} -map_metadata -1 -map_chapters -1 -f wav - | ${OPUSENC} --bitrate ${BR}k - "${OUTPUT}"
{ set +x; } 2>/dev/null