diff --git a/vertClip.sh b/vertClip.sh new file mode 100644 index 0000000..d35e330 --- /dev/null +++ b/vertClip.sh @@ -0,0 +1,169 @@ +#!/bin/bash +# Prereq - imagemagick and ffmpeg + +#------------------ [ Variables ] ------------------ +ccb=30 # Camera border (in case of blurry camera frame) +cch=360 # Height of video +ccw=640 # Width of video +ccd=$(((ccw-cch)/2)) # Difference between W and H divided by two +ccy=$((600+ccb)) # Y value of top left corner +ccx=$((1920+ccd+ccb)) # X value of top left corner +ccr=$((cch-ccb-ccb)) # Diameter of camera +ccn=2560 # Normalization value (what are values above expecting) +cam_w=500 # Width of camera in output +cam_h=500 # Height of camera in output +cam_feather=0 # Thickness of feather edge border (default is 0, no feather) +main_height=1250 # Height of primary video +kill_feed="false" +cam_crop=$ccr":"$ccr":"$ccx":"$ccy #coordinaces: width:height:left:top + + + +#------------------ [ Banner ] ------------------ +cat </dev/null; then + echo "ERROR: Missing dependency: ffmpeg" + fail="true" + fi + + if ! command -v identify >/dev/null; then + echo "ERROR: Missing dependency: imagemagick (identify)" + fail="true" + fi + + if [ fail == "true" ]; then + echo "INFO: Make sure you install dependencies" + exit 1 + fi +} + +#------------------ [ MAIN ] ------------------ +prereq + +while getopts "c:khl:v:" opt; do + case "$opt" in + c) + if [[ "$OPTARG" =~ ^[0-9]+$ ]]; then + cam_feather="$OPTARG" + fi + ;; + k) + kill_feed="500:150:2080:95" # No need to normalize, 2k CS matches 1080p Tarkov Arena killfeed + ;; + h) + usage + exit 0 + ;; + l) + if [ -f $OPTARG ]; then + logo="$OPTARG" + lh=`identify -format "%h" $logo` + lw=`identify -format "%w" $logo` + + if [ $lw -gt 1030 ]; then + lh=$(((lh*1030)/lw)) + lw=1030 + echo "INFO: Logo is more than 1030 wide, resized to 1030 - lh:"$lh" lw:"$lw + fi + + if [ $lh -gt 200 ]; then + lw=$(((lw*200)/lh)) + lh=200 + echo "INFO: Logo is more than 200 high, resized to 200 - lh:"$lh" lw:"$lw + fi + echo "INFO: Logo is lh:"$lh" lw:"$lw + else + logo="false" + fi + ;; + v) + if [ -f $OPTARG ]; then + vid="$OPTARG" + echo "INFO: Video appears valid, normalizing camera coordinaces" + vh=`ffprobe -v error -select_streams v:0 -show_entries stream=height -of csv=p=0:s=x $vid` + vw=`ffprobe -v error -select_streams v:0 -show_entries stream=width -of csv=p=0:s=x $vid` + if [ $vw != $ccn ]; then + ccw=$((ccw*vw/ccn)) + cch=$((cch*vw/ccn)) + ccx=$((ccx*vw/ccn)) + ccy=$((ccy*vw/ccn)) + ccr=$((ccr*vw/ccn)) + fi + cam_crop=$ccr":"$ccr":"$ccx":"$ccy + echo "INFO: Camera coordinaces "$cam_crop - $vw + else + echo "ERROR: You need to provide valid video path" + usage + exit 1 + fi + ;; + \?) + usage + exit 1 + ;; + :) + usage + exit 1 + ;; + esac +done + +inputs="-i "$vid + +if [ $logo != "false" ]; then + logo_place=$((((1920-main_height-cam_h-lh)/2)+main_height+cam_h)) # Calculate Y of logo + inputs=$inputs" -i "$logo +fi + +filter="[0:v]format=rgba,crop=$cam_crop,scale=$cam_w:$cam_h,geq=r='r(X,Y)':g='g(X,Y)':b='b(X,Y)':a='255*clip(1 - (sqrt(pow(X-$((cam_w/2)),2)+pow(Y-$((cam_h/2)),2)) - $(((cam_h/2)-cam_feather)))/$cam_feather, 0, 1)'[camera]; +[0:v]scale=-1:1920,crop=1080:1920,gblur=sigma=50[background]; +[0:v]scale=-1:$main_height[game]; +[background][game]overlay=(W-w)/2:$cam_h:format=auto[tmp1]; +[tmp1][camera]overlay=(W-w)/2:25:format=auto[tmp2]; +[tmp2][1:v]overlay=(W-w)/2:$logo_place:format=auto" + +if [ $kill_feed != "false" ]; then + filter="[0:v]crop=$kill_feed[killfeed];"$filter"[tmp3]; + [tmp3][killfeed]overlay=(W-w):575:format=auto" +fi + +echo "#################################################################" + +ffmpeg -hide_banner -loglevel error -stats $inputs -filter_complex "$filter" -c:a copy "output_$(date +%s)_$vid"