mirror of
https://github.com/levogevo/ffmpeg-builder.git
synced 2026-01-16 11:26:17 +00:00
Compare commits
2 Commits
5ed906017a
...
aa4d7e61f1
| Author | SHA1 | Date | |
|---|---|---|---|
| aa4d7e61f1 | |||
| 609ddea197 |
@@ -1,24 +1,25 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
unmap_streams() {
|
||||
# sets unmapStreams
|
||||
set_unmap_streams() {
|
||||
local file="$1"
|
||||
local unmapFilter='bin_data|jpeg|png'
|
||||
local unmap=()
|
||||
local streamsStr
|
||||
unmapStreams=()
|
||||
streamsStr="$(get_num_streams "${file}")" || return 1
|
||||
mapfile -t streams <<<"${streamsStr}" || return 1
|
||||
for stream in "${streams[@]}"; do
|
||||
if [[ "$(get_stream_codec "${file}" "${stream}")" =~ ${unmapFilter} ]]; then
|
||||
unmap+=("-map" "-0:${stream}")
|
||||
unmapStreams+=("-map" "-0:${stream}")
|
||||
fi
|
||||
done
|
||||
echo "${unmap[@]}"
|
||||
}
|
||||
|
||||
# sets audioParams
|
||||
set_audio_params() {
|
||||
local file="$1"
|
||||
local audioParams=()
|
||||
local videoLang
|
||||
audioParams=()
|
||||
videoLang="$(get_stream_lang "${file}" 'v:0')" || return 1
|
||||
for stream in $(get_num_streams "${file}" 'a'); do
|
||||
local numChannels codec lang
|
||||
@@ -37,28 +38,40 @@ set_audio_params() {
|
||||
)
|
||||
elif [[ ${codec} == 'opus' ]]; then
|
||||
audioParams+=(
|
||||
"-c:${stream}"
|
||||
"-c:${OUTPUT_INDEX}"
|
||||
"copy"
|
||||
)
|
||||
OUTPUT_INDEX=$((OUTPUT_INDEX + 1))
|
||||
else
|
||||
audioParams+=(
|
||||
"-filter:${stream}"
|
||||
"-filter:${OUTPUT_INDEX}"
|
||||
"aformat=channel_layouts=7.1|5.1|stereo|mono"
|
||||
"-c:${stream}"
|
||||
"-c:${OUTPUT_INDEX}"
|
||||
"libopus"
|
||||
"-b:${stream}"
|
||||
"-b:${OUTPUT_INDEX}"
|
||||
"${channelBitrate}k"
|
||||
)
|
||||
OUTPUT_INDEX=$((OUTPUT_INDEX + 1))
|
||||
fi
|
||||
done
|
||||
echo "${audioParams[@]}"
|
||||
}
|
||||
|
||||
# sets subtitleParams
|
||||
set_subtitle_params() {
|
||||
local file="$1"
|
||||
local convertCodec='eia_608'
|
||||
local keepLang='eng'
|
||||
local subtitleParams=()
|
||||
|
||||
local defaultTextCodec
|
||||
if [[ ${SAME_CONTAINER} == false && ${FILE_EXT} == 'mkv' ]]; then
|
||||
defaultTextCodec='srt'
|
||||
convertCodec+='|mov_text'
|
||||
else
|
||||
defaultTextCodec='mov_text'
|
||||
convertCodec+='|srt'
|
||||
fi
|
||||
|
||||
subtitleParams=()
|
||||
for stream in $(get_num_streams "${file}" 's'); do
|
||||
local codec lang
|
||||
codec="$(get_stream_codec "${file}" "${stream}")" || return 1
|
||||
@@ -68,11 +81,11 @@ set_subtitle_params() {
|
||||
'-map'
|
||||
"-0:${stream}"
|
||||
)
|
||||
elif [[ ${codec} == "${convertCodec}" ]]; then
|
||||
subtitleParams+=("-c:${stream}" "srt")
|
||||
elif [[ ${codec} =~ ${convertCodec} ]]; then
|
||||
subtitleParams+=("-c:${OUTPUT_INDEX}" "${defaultTextCodec}")
|
||||
OUTPUT_INDEX=$((OUTPUT_INDEX + 1))
|
||||
fi
|
||||
done
|
||||
echo "${subtitleParams[@]}"
|
||||
}
|
||||
|
||||
get_encode_versions() {
|
||||
@@ -140,7 +153,7 @@ encode_usage() {
|
||||
echo -e "\t[-c] use cropdetect (default: ${CROP})"
|
||||
echo -e "\t[-d] enable dolby vision (default: ${DV_TOGGLE})"
|
||||
echo -e "\t[-v] Print relevant version info"
|
||||
echo -e "\t[-s] use same container as input, default is mkv"
|
||||
echo -e "\t[-s] use same container as input, default is convert to mkv"
|
||||
echo -e "\n\t[output] if unset, defaults to ${HOME}/"
|
||||
echo -e "\n\t[-u] update script (git pull at ${REPO_DIR})"
|
||||
echo -e "\t[-I] system install at ${ENCODE_INSTALL_PATH}"
|
||||
@@ -163,7 +176,7 @@ set_encode_opts() {
|
||||
PRINT_OUT=false
|
||||
DV_TOGGLE=false
|
||||
ENCODE_INSTALL_PATH='/usr/local/bin/encode'
|
||||
local sameContainer="false"
|
||||
SAME_CONTAINER="false"
|
||||
# only using -I/U
|
||||
local minOpt=1
|
||||
# using all + output name
|
||||
@@ -217,7 +230,7 @@ set_encode_opts() {
|
||||
optsUsed=$((optsUsed + 1))
|
||||
;;
|
||||
s)
|
||||
sameContainer=true
|
||||
SAME_CONTAINER=true
|
||||
optsUsed=$((optsUsed + 1))
|
||||
;;
|
||||
g)
|
||||
@@ -262,7 +275,7 @@ set_encode_opts() {
|
||||
fi
|
||||
|
||||
# use same container for output
|
||||
if [[ $sameContainer == "true" ]]; then
|
||||
if [[ $SAME_CONTAINER == "true" ]]; then
|
||||
local fileFormat
|
||||
fileFormat="$(get_file_format "${INPUT}")" || return 1
|
||||
FILE_EXT=''
|
||||
@@ -299,6 +312,9 @@ set_encode_opts() {
|
||||
gen_encode_script() {
|
||||
local genScript="${TMP_DIR}/$(bash_basename "${OUTPUT}").sh"
|
||||
|
||||
# global output index number to increment
|
||||
OUTPUT_INDEX=0
|
||||
|
||||
# single string params
|
||||
local params=(
|
||||
INPUT
|
||||
@@ -337,7 +353,7 @@ gen_encode_script() {
|
||||
|
||||
# arrays
|
||||
local arrays=(
|
||||
unmap
|
||||
unmapStreams
|
||||
audioParams
|
||||
videoParams
|
||||
metadata
|
||||
@@ -348,28 +364,42 @@ gen_encode_script() {
|
||||
"-crf" '${CRF}' "-preset" '${PRESET}' "-g" "240"
|
||||
)
|
||||
local ffmpegParams=(
|
||||
'-hide_banner'
|
||||
'-i' '${INPUT}'
|
||||
'-y' '-map' '0'
|
||||
'-y'
|
||||
'-map' '0'
|
||||
'-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
|
||||
local unmapStr audioParamsStr subtitleParamsStr
|
||||
unmapStr="$(unmap_streams "${INPUT}")" || return 1
|
||||
audioParamsStr="$(set_audio_params "${INPUT}")" || return 1
|
||||
subtitleParamsStr="$(set_subtitle_params "${INPUT}")" || return 1
|
||||
set_unmap_streams "${INPUT}" || return 1
|
||||
set_audio_params "${INPUT}" || return 1
|
||||
set_subtitle_params "${INPUT}" || return 1
|
||||
|
||||
unmap=(${unmapStr})
|
||||
if [[ ${unmap[*]} != '' ]]; then
|
||||
ffmpegParams+=('${unmap[@]}')
|
||||
if [[ ${unmapStreams[*]} != '' ]]; then
|
||||
ffmpegParams+=('${unmapStreams[@]}')
|
||||
fi
|
||||
|
||||
audioParams=(${audioParamsStr})
|
||||
if [[ ${audioParams[*]} != '' ]]; then
|
||||
ffmpegParams+=('${audioParams[@]}')
|
||||
fi
|
||||
|
||||
subtitleParams=(${subtitleParamsStr})
|
||||
if [[ ${subtitleParams[*]} != '' ]]; then
|
||||
ffmpegParams+=('${subtitleParams[@]}')
|
||||
fi
|
||||
@@ -378,19 +408,6 @@ gen_encode_script() {
|
||||
ffmpegParams+=('-vf' '${crop}')
|
||||
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
|
||||
local metadata=(
|
||||
'-metadata' '${encodeVersion}'
|
||||
|
||||
@@ -89,7 +89,7 @@ print_req_pkgs() {
|
||||
doxygen jq ccache gawk rust
|
||||
git gnuplot bison rsync ragel
|
||||
zip unzip gperf build-essential
|
||||
binutils ninja
|
||||
binutils ninja ndk-multilib-native-static
|
||||
)
|
||||
|
||||
local req_pkgs_env_name="${pkg_mgr/-/_}_pkgs"
|
||||
|
||||
Reference in New Issue
Block a user