52 lines
1.6 KiB
Bash
Executable File
52 lines
1.6 KiB
Bash
Executable File
#!/usr/bin/env zsh
|
|
# Cut a clip from a video
|
|
|
|
setopt LOCAL_OPTIONS ERR_RETURN NO_UNSET PIPE_FAIL
|
|
|
|
zmodload zsh/zutil
|
|
local -a o_help=()
|
|
local -a o_from=()
|
|
local -a o_to=()
|
|
local -a o_vencoder=()
|
|
local -a o_aencoder=()
|
|
local -a o_hardcode_subs=()
|
|
zparseopts -D -K -- h=o_help -help=o_help -from:=o_from -to:=o_to \
|
|
-vencoder:=o_vencoder -aencoder:=o_aencoder \
|
|
-hardcode-subs=o_hardcode_subs
|
|
if [[ ${#o_help} -ne 0 || ! -v 2 || ${#o_from} -ne 2 || ${#o_to} -ne 2 ]]; then
|
|
local ret=$(( ${#o_help} ^ 1 ))
|
|
print -u $(( 1 + ${ret} )) "usage: ${0} [-h|--help]" \
|
|
"--from <HH:MM:SS.MMM> --to <HH:MM:SS.MMM>" \
|
|
"[--vencoder <ENCODER>] [--aencoder <ENCODER>] [--hardcode-subs]" \
|
|
"<INPUT FILE> <OUTPUT FILE> [FFMPEG OPTIONS]"
|
|
print -l "\e[3mYou can set bitrates with -b:v and -b:a in FFMPEG OPTIONS" \
|
|
"Visit <https://trac.ffmpeg.org/wiki#Encoding> for tips\e[0m"
|
|
return ${ret}
|
|
fi
|
|
|
|
local input=${1}
|
|
shift
|
|
local output=${1}
|
|
shift
|
|
local ffmpeg_options=(${@})
|
|
local from=${o_from[2]}
|
|
local to=${o_to[2]}
|
|
local vencoder="copy"
|
|
local aencoder="copy"
|
|
[[ ${#o_vencoder} -eq 2 ]] && vencoder=${o_vencoder[2]}
|
|
[[ ${#o_aencoder} -eq 2 ]] && aencoder=${o_aencoder[2]}
|
|
local subtitle_options=(-codec:s copy)
|
|
|
|
if [[ ${#o_hardcode_subs} -ne 0 ]]; then
|
|
local tmpass=$(mktemp --suffix='.cutvid.ass')
|
|
ffmpeg -i ${input} -y ${tmpass}
|
|
subtitle_options=(-sn -vf ass=${tmpass} )
|
|
fi
|
|
|
|
ffmpeg -i ${input} \
|
|
-ss ${from} -to ${to} \
|
|
-codec:v ${vencoder} -codec:a ${aencoder} ${subtitle_options} \
|
|
${ffmpeg_options} ${output}
|
|
|
|
[[ ${#o_hardcode_subs} -ne 0 ]] && rm --verbose ${tmpass}
|