mirror of
https://github.com/levogevo/ffmpeg-builder.git
synced 2026-01-15 19:06:17 +00:00
copy av1 inputs, copy audio lang that matches video, and only copy english subs
This commit is contained in:
170
lib/encode.sh
170
lib/encode.sh
@@ -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'
|
||||||
|
|||||||
@@ -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}"
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user