#! /bin/zsh # # this file: # https://dataswamp.org/~incal/conf/.zsh/video-slice ################### ## slice and dice ## ## video stuff :) ## ################### # ffmpeg -ss 00:01:00 -to 00:02:00 -i input.mp4 -c copy output.mp4 # ffmpeg -ss 00:22:28 -t 00:26:27 -i si2023v11.webm -c copy dwmt.webm # ffmpeg -i si2023v11.webm -ss 00:22:28 -t 00:26:27 -async 1 dwim3.webm # https://unix.stackexchange.com/a/212518 split-video () { local fs=($@) local s=1 local f local src local name local ext for f in $fs; do src=$f name=${src:r} ext=${src:e} ffmpeg \ -i $src \ -c copy \ -map 0 \ -segment_time 00:00:${s} \ -f segment \ -reset_timestamps 1 \ ${name}-%03d.${ext} done } # 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 src=$5 local name=${src:r} local ext=${src:e} local dst=${name}-crop.${ext} ffmpeg \ -y \ -i $src \ -filter:v "crop=${w}:${h}:${x}:${y}" \ -c:a copy \ $dst } 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 dst=${name}-no-border.${ext} ffmpeg \ -y \ -i $src \ -vf "crop=in_w-${x_border}:in_h-${y_border}" \ -c:a copy \ $dst } 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 } # DNC video-merge-ts () { local src1=$1 local src2=$2 local name1=${src1:r} local name2=${src2:r} local dst1=${name1}-ts.ts local dst2=${name2}-ts.ts local dst_name=${name1}-${name2} local dst=${dst_name}.ts local mp4=${dst_name}.mp4 ffmpeg -y -i $src1 -c copy -bsf:v h264_mp4toannexb -f mpegts ${dst1} ffmpeg -y -i $src1 -c copy -bsf:v h264_mp4toannexb -f mpegts ${dst2} cat ${dst1} ${dst2} > ${dst} ffmpeg -y -i ${dst} -c copy -bsf:a aac_adtstoasc $mp4 } # DNC video-merge-tc () { local src1=$1 local src2=$2 local name=${src1:r}-${src2:r} local ext=${src1:e} local dst=${name}.${ext} ffmpeg -y \ -i $src1 \ -i $src2 \ -filter_complex "[0:v] [0:a] [1:v] [1:a] concat=n=2:v=1:a=1 [vv] [aa]" \ -map "[vv]" \ -map "[aa]" \ $dst } video-merge () { local src1=$1 local src2=$2 local name=${src1:r}-${src2:r} local ext=${src1:e} local dst=${name}.${ext} local list_file=both.txt echo "file $src1" > $list_file echo "file $src2" >> $list_file ffmpeg \ -y \ -f concat \ -safe 0 \ -i $list_file \ -c copy \ $dst } slice-video () { # usage: # slice-video FILE [BEG_SEC=-2] LEN_SEC local src=$1 local name=${src:r} local ext=${src:e} local dst=${name}-sliced.${ext} local beg local len case $# in (2) beg=-2 len=$2 ;; (3) beg=$2 len=$3 ;; (*) wrong-number-of-arguments-message $(( $# - 1 )) "1 or 2" return ;; esac ffmpeg \ -y \ -v quiet \ -i $src \ -ss $beg \ -t $len \ -c:a copy \ -c:v copy \ $dst len $dst } video-drop-after () { local after=$1 local f=$2 slice-video $f $after }