#!/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 --to " \ "[--vencoder ] [--aencoder ] [--hardcode-subs]" \ " [FFMPEG OPTIONS]" print "\e[3mYou can set bitrates with -b:v and -b:a in FFMPEG OPTIONS." \ "The -vn / -an / -sn / -dn options can be used to skip inclusion of" \ "video, audio, subtitle and data streams respectively." print "Visit 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) local compat_options=(-pix_fmt yuv420p) # Android doesn't like yuv420p10le 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} \ ${compat_options} ${ffmpeg_options} ${output} [[ ${#o_hardcode_subs} -ne 0 ]] && rm --verbose ${tmpass}