fix mismatch of output stream index vs input stream index

This commit is contained in:
2025-11-25 14:06:55 -06:00
parent 609ddea197
commit aa4d7e61f1

View File

@@ -1,24 +1,25 @@
#!/usr/bin/env bash #!/usr/bin/env bash
unmap_streams() { # sets unmapStreams
set_unmap_streams() {
local file="$1" local file="$1"
local unmapFilter='bin_data|jpeg|png' local unmapFilter='bin_data|jpeg|png'
local unmap=()
local streamsStr local streamsStr
unmapStreams=()
streamsStr="$(get_num_streams "${file}")" || return 1 streamsStr="$(get_num_streams "${file}")" || return 1
mapfile -t streams <<<"${streamsStr}" || return 1 mapfile -t streams <<<"${streamsStr}" || return 1
for stream in "${streams[@]}"; do for stream in "${streams[@]}"; do
if [[ "$(get_stream_codec "${file}" "${stream}")" =~ ${unmapFilter} ]]; then if [[ "$(get_stream_codec "${file}" "${stream}")" =~ ${unmapFilter} ]]; then
unmap+=("-map" "-0:${stream}") unmapStreams+=("-map" "-0:${stream}")
fi fi
done done
echo "${unmap[@]}"
} }
# sets audioParams
set_audio_params() { set_audio_params() {
local file="$1" local file="$1"
local audioParams=()
local videoLang local videoLang
audioParams=()
videoLang="$(get_stream_lang "${file}" 'v:0')" || return 1 videoLang="$(get_stream_lang "${file}" 'v:0')" || return 1
for stream in $(get_num_streams "${file}" 'a'); do for stream in $(get_num_streams "${file}" 'a'); do
local numChannels codec lang local numChannels codec lang
@@ -37,23 +38,25 @@ set_audio_params() {
) )
elif [[ ${codec} == 'opus' ]]; then elif [[ ${codec} == 'opus' ]]; then
audioParams+=( audioParams+=(
"-c:${stream}" "-c:${OUTPUT_INDEX}"
"copy" "copy"
) )
OUTPUT_INDEX=$((OUTPUT_INDEX + 1))
else else
audioParams+=( audioParams+=(
"-filter:${stream}" "-filter:${OUTPUT_INDEX}"
"aformat=channel_layouts=7.1|5.1|stereo|mono" "aformat=channel_layouts=7.1|5.1|stereo|mono"
"-c:${stream}" "-c:${OUTPUT_INDEX}"
"libopus" "libopus"
"-b:${stream}" "-b:${OUTPUT_INDEX}"
"${channelBitrate}k" "${channelBitrate}k"
) )
OUTPUT_INDEX=$((OUTPUT_INDEX + 1))
fi fi
done done
echo "${audioParams[@]}"
} }
# sets subtitleParams
set_subtitle_params() { set_subtitle_params() {
local file="$1" local file="$1"
local convertCodec='eia_608' local convertCodec='eia_608'
@@ -68,7 +71,7 @@ set_subtitle_params() {
convertCodec+='|srt' convertCodec+='|srt'
fi fi
local subtitleParams=() subtitleParams=()
for stream in $(get_num_streams "${file}" 's'); do for stream in $(get_num_streams "${file}" 's'); do
local codec lang local codec lang
codec="$(get_stream_codec "${file}" "${stream}")" || return 1 codec="$(get_stream_codec "${file}" "${stream}")" || return 1
@@ -79,10 +82,10 @@ set_subtitle_params() {
"-0:${stream}" "-0:${stream}"
) )
elif [[ ${codec} =~ ${convertCodec} ]]; then elif [[ ${codec} =~ ${convertCodec} ]]; then
subtitleParams+=("-c:${stream}" "${defaultTextCodec}") subtitleParams+=("-c:${OUTPUT_INDEX}" "${defaultTextCodec}")
OUTPUT_INDEX=$((OUTPUT_INDEX + 1))
fi fi
done done
echo "${subtitleParams[@]}"
} }
get_encode_versions() { get_encode_versions() {
@@ -309,6 +312,9 @@ set_encode_opts() {
gen_encode_script() { gen_encode_script() {
local genScript="${TMP_DIR}/$(bash_basename "${OUTPUT}").sh" local genScript="${TMP_DIR}/$(bash_basename "${OUTPUT}").sh"
# global output index number to increment
OUTPUT_INDEX=0
# single string params # single string params
local params=( local params=(
INPUT INPUT
@@ -347,7 +353,7 @@ gen_encode_script() {
# arrays # arrays
local arrays=( local arrays=(
unmap unmapStreams
audioParams audioParams
videoParams videoParams
metadata metadata
@@ -358,28 +364,42 @@ gen_encode_script() {
"-crf" '${CRF}' "-preset" '${PRESET}' "-g" "240" "-crf" '${CRF}' "-preset" '${PRESET}' "-g" "240"
) )
local ffmpegParams=( local ffmpegParams=(
'-hide_banner'
'-i' '${INPUT}' '-i' '${INPUT}'
'-y' '-map' '0' '-y'
'-map' '0'
'-c:s' 'copy' '-c:s' 'copy'
) )
# set video params
local inputVideoCodec="$(get_stream_codec "${INPUT}" 'v:0')"
if [[ ${inputVideoCodec} == 'av1' ]]; then
ffmpegParams+=(
"-c:v:${OUTPUT_INDEX}" 'copy'
)
else
ffmpegParams+=(
'-pix_fmt' 'yuv420p10le'
"-c:v:${OUTPUT_INDEX}" 'libsvtav1' '${videoParams[@]}'
'-svtav1-params' '${svtAv1Params}'
)
fi
OUTPUT_INDEX=$((OUTPUT_INDEX + 1))
# these values may be empty # these values may be empty
local unmapStr audioParamsStr subtitleParamsStr local unmapStr audioParamsStr subtitleParamsStr
unmapStr="$(unmap_streams "${INPUT}")" || return 1 set_unmap_streams "${INPUT}" || return 1
audioParamsStr="$(set_audio_params "${INPUT}")" || return 1 set_audio_params "${INPUT}" || return 1
subtitleParamsStr="$(set_subtitle_params "${INPUT}")" || return 1 set_subtitle_params "${INPUT}" || return 1
unmap=(${unmapStr}) if [[ ${unmapStreams[*]} != '' ]]; then
if [[ ${unmap[*]} != '' ]]; then ffmpegParams+=('${unmapStreams[@]}')
ffmpegParams+=('${unmap[@]}')
fi fi
audioParams=(${audioParamsStr})
if [[ ${audioParams[*]} != '' ]]; then if [[ ${audioParams[*]} != '' ]]; then
ffmpegParams+=('${audioParams[@]}') ffmpegParams+=('${audioParams[@]}')
fi fi
subtitleParams=(${subtitleParamsStr})
if [[ ${subtitleParams[*]} != '' ]]; then if [[ ${subtitleParams[*]} != '' ]]; then
ffmpegParams+=('${subtitleParams[@]}') ffmpegParams+=('${subtitleParams[@]}')
fi fi
@@ -388,19 +408,6 @@ gen_encode_script() {
ffmpegParams+=('-vf' '${crop}') ffmpegParams+=('-vf' '${crop}')
fi fi
local inputVideoCodec="$(get_stream_codec "${INPUT}" 'v:0')"
if [[ ${inputVideoCodec} == 'av1' ]]; then
ffmpegParams+=(
'-c:v' 'copy'
)
else
ffmpegParams+=(
'-pix_fmt' 'yuv420p10le'
'-c:v' 'libsvtav1' '${videoParams[@]}'
'-svtav1-params' '${svtAv1Params}'
)
fi
get_encode_versions || return 1 get_encode_versions || return 1
local metadata=( local metadata=(
'-metadata' '${encodeVersion}' '-metadata' '${encodeVersion}'