#!/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"