#! /bin/zsh # # this file: # http://user.it.uu.se/~embe8573/conf/.zsh/video-slice # https://dataswamp.org/~incal/conf/.zsh/video-slice ################### ## slice and dice ## ## video stuff :) ## ################### # https://video.stackexchange.com/questions/4563/how-can-i-crop-a-video-with-ffmpeg video-crop () { local x=$1 local y=$2 local w=$3 local h=$4 local vid=$5 local name=${vid:r} local ext=${vid:e} local out=${name}-cropped.${ext} ffmpeg -y -i $vid -filter:v "crop=$w:$h:$x:$y" -c:a copy ${out} } video-remove-border () { local border=$1 local src=$2 local x_border=$(( 2 * $border )) local y_border=$x_border local name=${src:r} local ext=${src:e} local out=${name}-no-border.${ext} ffmpeg \ -y \ -i $src \ -vf "crop=in_w-${x_border}:in_h-${y_border}" \ -c:a copy \ $out } video-add-border () { local src=$1 local w=${2:-1080} local h=${3:-1920} local name=${src:r} local ext=${src:e} local dst=${name}-border.${ext} local ar="${w}:${h}" ffmpeg \ -y \ -i $src \ -vf "scale=${ar}:force_original_aspect_ratio=decrease,pad=${ar}:(ow-iw)/2:(oh-ih)/2,setsar=1" \ $dst } video-merge () { local first=$1 local second=$2 local name=${first:r}-${second:r} local ext=${first:e} local out=${name}.${ext} local list_file=both.txt echo "file $first" > $list_file echo "file $second" >> $list_file ffmpeg -f concat -safe 0 -i $list_file -c copy $out } slice-video () { # usage: # slice-video FILE [START_SECONDS=-2] LEN_SECONDS local src=$1 local name=${src:r} local ext=${src:e} local dst=${name}-sliced.${ext} local start local len case $# in (2) start=-2 len=$2 ;; (3) start=$2 len=$3 ;; (*) wrong-number-of-arguments-message ;; esac # y is overwrite ffmpeg -v quiet \ -i $src \ -ss $start \ -t $len \ -y \ -c:a copy \ -c:v copy $dst } video-drop-from () { slice-video $1 $2 } split-video () { local parts=$1 local file=$2 local name=${file:r} local ext=${file:e} local video_len=$(video-seconds $file) local part_len=$(( int($video_len/$parts) )) local part_start local part_name for p in {1..${parts}}; do part_start=$(( ($p - 1)*${part_len} )) part_name=${name}-${p}.${ext} ffmpeg -ss $part_start \ -i $file \ -t $part_len \ -c:a copy \ -c:v copy $part_name done }