copy av1 inputs, copy audio lang that matches video, and only copy english subs

This commit is contained in:
2025-10-19 14:14:12 -05:00
parent 4b88fe30f8
commit d5680d8816
2 changed files with 105 additions and 93 deletions

View File

@@ -15,21 +15,29 @@ unmap_streams() {
echo "${unmap[@]}" echo "${unmap[@]}"
} }
set_audio_bitrate() { set_audio_params() {
local file="$1" local file="$1"
local bitrate=() local audioParams=()
for stream in $(get_num_audio_streams "${file}"); do local videoLang
local numChannels codec videoLang="$(get_stream_lang "${file}" 'v:0')" || return 1
numChannels="$(get_num_audio_channels "${file}" "${stream}")" || return 1 for stream in $(get_num_streams "${file}" 'a'); do
local numChannels codec lang
numChannels="$(get_num_audio_channels "${file}" "a:${stream}")" || return 1
local channelBitrate=$((numChannels * 64)) local channelBitrate=$((numChannels * 64))
codec="$(get_stream_codec "${file}" "${stream}")" || return 1 codec="$(get_stream_codec "${file}" "${stream}")" || return 1
if [[ ${codec} == 'opus' ]]; then lang="$(get_stream_lang "${file}" "${stream}")" || return 1
bitrate+=( if [[ ${videoLang} != '' && ${videoLang} != "${lang}" ]]; then
audioParams+=(
'-map'
"-0:${stream}"
)
elif [[ ${codec} == 'opus' ]]; then
audioParams+=(
"-c:${stream}" "-c:${stream}"
"copy" "copy"
) )
else else
bitrate+=( audioParams+=(
"-filter:${stream}" "-filter:${stream}"
"aformat=channel_layouts=7.1|5.1|stereo|mono" "aformat=channel_layouts=7.1|5.1|stereo|mono"
"-c:${stream}" "-c:${stream}"
@@ -39,62 +47,61 @@ set_audio_bitrate() {
) )
fi fi
done done
echo "${bitrate[@]}" echo "${audioParams[@]}"
} }
convert_subs() { set_subtitle_params() {
local file="$1" local file="$1"
local convertCodec='eia_608' local convertCodec='eia_608'
local convert=() local keepLang='eng'
for stream in $(get_num_streams "${file}"); do local subtitleParams=()
if [[ "$(get_stream_codec "${file}" "${stream}")" == "${convertCodec}" ]]; then for stream in $(get_num_streams "${file}" 's'); do
convert+=("-c:${stream}" "srt") local codec lang
codec="$(get_stream_codec "${file}" "${stream}")" || return 1
lang="$(get_stream_lang "${file}" "${stream}")" || return 1
if [[ ${lang} != '' && ${keepLang} != "${lang}" ]]; then
subtitleParams+=(
'-map'
"-0:${stream}"
)
elif [[ ${codec} == "${convertCodec}" ]]; then
subtitleParams+=("-c:${stream}" "srt")
fi fi
done done
echo "${convert[@]}" echo "${subtitleParams[@]}"
} }
encode_version() ( get_encode_versions() {
cd "${REPO_DIR}" || exit 1 action="${1:-}"
echo "encode=$(git rev-parse --short HEAD)"
)
ffmpeg_version() { encodeVersion="encode=$(git -C "${REPO_DIR}" rev-parse --short HEAD)"
local output="$(ffmpeg 2>&1)" ffmpegVersion=''
local commit='' videoEncVersion=''
local version='' audioEncVersion=''
# shellcheck disable=SC2155
local output="$(ffmpeg -hide_banner 2>&1)"
while read -r line; do while read -r line; do
if line_contains "${line}" 'ffmpeg version'; then
read -r _ _ commit _ <<<"${line}"
fi
if line_contains "${line}" 'ffmpeg='; then if line_contains "${line}" 'ffmpeg='; then
IFS='=' read -r _ version <<<"${line}" ffmpegVersion="${line}"
elif line_contains "${line}" 'libsvtav1_psy=' || line_contains "${line}" 'libsvtav1='; then
videoEncVersion="${line}"
elif line_contains "${line}" 'libopus='; then
audioEncVersion="${line}"
fi fi
done <<<"${output}" done <<<"${output}"
echo "ffmpeg=${version}-${commit}"
}
video_enc_version() { test "${ffmpegVersion}" == '' && return 1
local output="$(ffmpeg -hide_banner 2>&1)" test "${videoEncVersion}" == '' && return 1
while read -r line; do test "${audioEncVersion}" == '' && return 1
if line_contains "${line}" 'libsvtav1_psy='; then
echo "${line}"
break
elif line_contains "${line}" 'libsvtav1='; then
echo "${line}"
break
fi
done <<<"${output}"
}
audio_enc_version() { if [[ ${action} == 'print' ]]; then
local output="$(ffmpeg -hide_banner 2>&1)" echo "${encodeVersion}"
while read -r line; do echo "${ffmpegVersion}"
if line_contains "${line}" 'libopus='; then echo "${videoEncVersion}"
echo "${line}" echo "${audioEncVersion}"
break fi
fi return 0
done <<<"${output}"
} }
encode_usage() { encode_usage() {
@@ -115,8 +122,7 @@ encode_usage() {
} }
encode_update() { encode_update() {
cd "${REPO_DIR}" || return 1 git -C "${REPO_DIR}" pull
git pull
} }
set_encode_opts() { set_encode_opts() {
@@ -159,10 +165,7 @@ set_encode_opts() {
exit 0 exit 0
;; ;;
v) v)
encode_version get_encode_versions print
ffmpeg_version
video_enc_version
audio_enc_version
exit 0 exit 0
;; ;;
i) i)
@@ -277,21 +280,16 @@ gen_encode_script() {
PRESET PRESET
CRF CRF
crop crop
videoEncoder encodeVersion
ffmpegVersion ffmpegVersion
videoEncVersion videoEncVersion
audioEncVersion audioEncVersion
svtAv1Params svtAv1Params
svtAv1ParamsMetadata
) )
local crop='' local crop=''
if [[ $CROP == "true" ]]; then if [[ $CROP == "true" ]]; then
crop="$(get_crop "${INPUT}")" || return 1 crop="$(get_crop "${INPUT}")" || return 1
fi fi
local videoEncoder='libsvtav1'
local ffmpegVersion="$(ffmpeg_version)"
local videoEncVersion="$(video_enc_version)"
local audioEncVersion="$(audio_enc_version)"
svtAv1ParamsArr=( svtAv1ParamsArr=(
"tune=0" "tune=0"
@@ -311,16 +309,13 @@ gen_encode_script() {
local svtAv1Params="${GRAIN}${svtAv1ParamsArr[*]}" local svtAv1Params="${GRAIN}${svtAv1ParamsArr[*]}"
unset IFS unset IFS
local svtAv1ParamsMetadata='svtav1_params=${svtAv1Params}'
# arrays # arrays
local arrays=( local arrays=(
unmap unmap
audioBitrate audioParams
videoParams videoParams
videoParamsMetadata
metadata metadata
convertSubs subtitleParams
ffmpegParams ffmpegParams
) )
local videoParams=( local videoParams=(
@@ -333,44 +328,53 @@ gen_encode_script() {
) )
# these values may be empty # these values may be empty
local unmapStr audioBitrateStr convertSubsStr local unmapStr audioParamsStr subtitleParamsStr
unmapStr="$(unmap_streams "${INPUT}")" || return 1 unmapStr="$(unmap_streams "${INPUT}")" || return 1
audioBitrateStr="$(set_audio_bitrate "${INPUT}")" || return 1 audioParamsStr="$(set_audio_params "${INPUT}")" || return 1
convertSubsStr="$(convert_subs "${INPUT}")" || return 1 subtitleParamsStr="$(set_subtitle_params "${INPUT}")" || return 1
unmap=(${unmapStr}) unmap=(${unmapStr})
if [[ ${unmap[*]} != '' ]]; then if [[ ${unmap[*]} != '' ]]; then
ffmpegParams+=('${unmap[@]}') ffmpegParams+=('${unmap[@]}')
fi fi
audioBitrate=(${audioBitrateStr}) audioParams=(${audioParamsStr})
if [[ ${audioBitrate[*]} != '' ]]; then if [[ ${audioParams[*]} != '' ]]; then
ffmpegParams+=('${audioBitrate[@]}') ffmpegParams+=('${audioParams[@]}')
fi fi
convertSubs=(${convertSubsStr}) subtitleParams=(${subtitleParamsStr})
if [[ ${convertSubs[*]} != '' ]]; then if [[ ${subtitleParams[*]} != '' ]]; then
ffmpegParams+=('${convertSubs[@]}') ffmpegParams+=('${subtitleParams[@]}')
fi fi
if [[ ${crop} != '' ]]; then if [[ ${crop} != '' ]]; then
ffmpegParams+=('-vf' '${crop}') ffmpegParams+=('-vf' '${crop}')
fi fi
ffmpegParams+=( local inputVideoCodec="$(get_stream_codec "${INPUT}" 'v:0')"
'-pix_fmt' 'yuv420p10le' '-c:V' '${videoEncoder}' '${videoParams[@]}' if [[ ${inputVideoCodec} == 'av1' ]]; then
'-svtav1-params' '${svtAv1Params}' ffmpegParams+=(
'${metadata[@]}' '-c:v' 'copy'
) )
else
ffmpegParams+=(
'-pix_fmt' 'yuv420p10le'
'-c:v' 'libsvtav1' '${videoParams[@]}'
'-svtav1-params' '${svtAv1Params}'
)
fi
local videoParamsMetadata='video_params=${videoParams[*]}' get_encode_versions || return 1
local metadata=( local metadata=(
'-metadata' '${encodeVersion}'
'-metadata' '${ffmpegVersion}' '-metadata' '${ffmpegVersion}'
'-metadata' '${videoEncVersion}' '-metadata' '${videoEncVersion}'
'-metadata' '${audioEncVersion}' '-metadata' '${audioEncVersion}'
'-metadata' '${svtAv1ParamsMetadata}' '-metadata' 'svtav1_params=${svtAv1Params}'
'-metadata' '${videoParamsMetadata[@]}' '-metadata' 'video_params=${videoParams[*]}'
) )
ffmpegParams+=('${metadata[@]}')
{ {
echo '#!/usr/bin/env bash' echo '#!/usr/bin/env bash'

View File

@@ -91,18 +91,15 @@ get_file_format() {
get_num_streams() { get_num_streams() {
local file="$1" local file="$1"
ffprobe \ local type="${2:-}"
-v error \ local select=()
-show_entries stream=index \
-of default=noprint_wrappers=1:nokey=1 \ if [[ ${type} != '' ]]; then
"${file}" select=("-select_streams" "${type}")
} fi
get_num_audio_streams() {
local file="$1"
ffprobe \ ffprobe \
-v error \ -v error "${select[@]}" \
-select_streams a \
-show_entries stream=index \ -show_entries stream=index \
-of default=noprint_wrappers=1:nokey=1 \ -of default=noprint_wrappers=1:nokey=1 \
"${file}" "${file}"
@@ -118,3 +115,14 @@ get_num_audio_channels() {
-of default=noprint_wrappers=1:nokey=1 \ -of default=noprint_wrappers=1:nokey=1 \
"${file}" "${file}"
} }
get_stream_lang() {
local file="$1"
local stream="$2"
ffprobe \
-v error \
-select_streams "${stream}" \
-show_entries stream_tags=language \
-of default=noprint_wrappers=1:nokey=1 \
"${file}"
}