397 lines
		
	
	
		
			9.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			397 lines
		
	
	
		
			9.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
#!/usr/bin/env bash
 | 
						|
 | 
						|
function get-output-filename {
 | 
						|
        # takes fileinput, returns fileoutput name; takes optional $2 argument to tack onto end of name
 | 
						|
        name="$(cut -d'.' -f1 <<<"$1")"
 | 
						|
        ext="$(cut -d'.' -f2 <<<"$1")"
 | 
						|
        echo "${name}_${2}.${ext}"
 | 
						|
}
 | 
						|
 | 
						|
function timelapse() {
 | 
						|
	framerate="$1"
 | 
						|
	filename="$2"
 | 
						|
	resolution_width="$3"
 | 
						|
	resolution_height="$4"
 | 
						|
	$(type -P ls) -1tr ./*.JPG >gopro_timelapse_list.txt
 | 
						|
	mencoder -nosound -ovc x264 \
 | 
						|
		-vf scale="$resolution_width":"$resolution_height" -mf type=jpeg:fps="$framerate" \
 | 
						|
		mf://@gopro_timelapse_list.txt -o "$filename"
 | 
						|
	rm gopro_timelapse_list.txt
 | 
						|
}
 | 
						|
 | 
						|
function superview() {
 | 
						|
	for i in *.MP4; do
 | 
						|
		name=$(echo "$i" | cut -d'.' -f1)+S
 | 
						|
		echo "$name"
 | 
						|
		ffmpeg -i "$i" -q:a 1 -q:v 1 0 -vcodec mpeg4 -acodec ac3 -aspect 16:9 -strict experimental "$name".MP4
 | 
						|
	done
 | 
						|
}
 | 
						|
 | 
						|
function fisheye() {
 | 
						|
	#echo "https://gopro.com/help/articles/Question_Answer/HERO4-Field-of-View-FOV-Information"
 | 
						|
	echo -ne "Resolution:\n-[0] 4:3 Wide FOV\n-[1] 4:3 Medium FOV\n-[2] 4:3 Narrow FOV\nPhoto resolution: "
 | 
						|
	read -r res
 | 
						|
	distortion_args=""
 | 
						|
	case $res in
 | 
						|
	0*)
 | 
						|
		distortion_args="0 0 -0.3"
 | 
						|
		;;
 | 
						|
	1*)
 | 
						|
		distortion_args="0 0 -0.2"
 | 
						|
		;;
 | 
						|
	2*)
 | 
						|
		distortion_args="0 0 -0.1"
 | 
						|
		;;
 | 
						|
	esac
 | 
						|
	if [[ $1 == "" ]]; then
 | 
						|
		for photo in *.JPG; do
 | 
						|
			timestamp=$(stat -c %y "$photo")
 | 
						|
			mogrify -distort barrel "$distortion_args" "$photo"
 | 
						|
			touch -d "$timestamp" "$photo"
 | 
						|
		done
 | 
						|
	else
 | 
						|
		timestamp=$(stat -c %y "$1")
 | 
						|
		mogrify -distort barrel "$distortion_args" "$1"
 | 
						|
		touch -d "$timestamp" "$1"
 | 
						|
	fi
 | 
						|
}
 | 
						|
 | 
						|
function fisheye_video() {
 | 
						|
	#echo "https://gopro.com/help/articles/Question_Answer/HERO4-Field-of-View-FOV-Information"
 | 
						|
	#https://gopro.com/help/articles/question_answer/HERO3-Black-Edition-Field-of-View-FOV-Information
 | 
						|
	#https://gopro.com/help/articles/Question_Answer/HERO4-Field-of-View-FOV-Information
 | 
						|
	#https://gopro.com/help/articles/Question_Answer/HERO5-Black-Field-of-View-FOV-Information
 | 
						|
	#http://www.kolor.com/wiki-en/action/view/Autopano_Video_-_Focal_length_and_field_of_view
 | 
						|
	#https://gopro.com/help/articles/question_answer/hero6-black-field-of-view-fov-information
 | 
						|
 | 
						|
	vfov=0
 | 
						|
	hfov=0
 | 
						|
	diag=0
 | 
						|
 | 
						|
	echo -ne "Camera:
 | 
						|
			-[0] HERO3
 | 
						|
			-[1] HERO4/5
 | 
						|
			-[2] HERO6
 | 
						|
			>> Camera: "
 | 
						|
	read -r cam
 | 
						|
	case $cam in
 | 
						|
	0*)
 | 
						|
		echo ">> HERO3"
 | 
						|
		echo -ne "Resolution:
 | 
						|
			-[0] 4:3 Wide FOV
 | 
						|
			-[1] 4:3 Medium FOV
 | 
						|
			-[2] 4:3 Narrow FOV
 | 
						|
			-[3] 16:9 Wide FOV
 | 
						|
			-[4] 16:9 Medium FOV
 | 
						|
			-[5] 16:9 Narrow FOV
 | 
						|
			>> Video resolution: "
 | 
						|
		read -r res
 | 
						|
		case $res in
 | 
						|
		0*)
 | 
						|
			hfov=94.4
 | 
						|
			vfov=122.6
 | 
						|
			diag=149.2
 | 
						|
			;;
 | 
						|
		1*)
 | 
						|
			hfov=72.2
 | 
						|
			vfov=94.4
 | 
						|
			diag=115.7
 | 
						|
			;;
 | 
						|
		2*)
 | 
						|
			hfov=49.1
 | 
						|
			vfov=64.6
 | 
						|
			diag=79.7
 | 
						|
			;;
 | 
						|
		3*)
 | 
						|
			hfov=69.5
 | 
						|
			vfov=118.2
 | 
						|
			diag=133.6
 | 
						|
			;;
 | 
						|
		4*)
 | 
						|
			hfov=55
 | 
						|
			vfov=94.4
 | 
						|
			diag=107.1
 | 
						|
			;;
 | 
						|
		5*)
 | 
						|
			hfov=37.2
 | 
						|
			vfov=64.4
 | 
						|
			diag=73.6
 | 
						|
			;;
 | 
						|
		esac
 | 
						|
		;;
 | 
						|
	1*)
 | 
						|
		echo ">> HERO4"
 | 
						|
		echo -ne "Resolution:
 | 
						|
			-[0] 4:3 Wide FOV
 | 
						|
			-[1] 4:3 Medium FOV
 | 
						|
			-[2] 4:3 Narrow FOV
 | 
						|
			-[3] 16:9 Wide FOV
 | 
						|
			-[4] 16:9 Medium FOV
 | 
						|
			-[5] 16:9 Narrow FOV
 | 
						|
			>> Video resolution: "
 | 
						|
		read -r res
 | 
						|
		case $res in
 | 
						|
		0*)
 | 
						|
			hfov=94.4
 | 
						|
			vfov=122.6
 | 
						|
			diag=149.2
 | 
						|
			;;
 | 
						|
		1*)
 | 
						|
			hfov=72.2
 | 
						|
			vfov=94.4
 | 
						|
			diag=115.7
 | 
						|
			;;
 | 
						|
		2*)
 | 
						|
			hfov=49.1
 | 
						|
			vfov=64.6
 | 
						|
			diag=79.7
 | 
						|
			;;
 | 
						|
		3*)
 | 
						|
			hfov=69.5
 | 
						|
			vfov=118.2
 | 
						|
			diag=133.6
 | 
						|
			;;
 | 
						|
		4*)
 | 
						|
			hfov=55
 | 
						|
			vfov=94.4
 | 
						|
			diag=107.1
 | 
						|
			;;
 | 
						|
		5*)
 | 
						|
			hfov=37.2
 | 
						|
			vfov=64.4
 | 
						|
			diag=73.6
 | 
						|
			;;
 | 
						|
		esac
 | 
						|
		;;
 | 
						|
	2*)
 | 
						|
		echo ">> HERO6"
 | 
						|
		echo -ne "Resolution:
 | 
						|
			-[0] 4:3 Wide FOV ZOOM 0
 | 
						|
			-[1] 4:3 Wide FOV ZOOM 100
 | 
						|
			-[2] 16:9 Wide FOV ZOOM 0
 | 
						|
			-[3] 16:9 Wide FOV ZOOM 100
 | 
						|
			>> Video resolution: "
 | 
						|
		read -r res
 | 
						|
		case $res in
 | 
						|
		0*)
 | 
						|
			hfov=94.4
 | 
						|
			vfov=122.6
 | 
						|
			diag=149.2
 | 
						|
			;;
 | 
						|
		1*)
 | 
						|
			hfov=49.1
 | 
						|
			vfov=64.6
 | 
						|
			diag=79.7
 | 
						|
			;;
 | 
						|
		2*)
 | 
						|
			hfov=69.5
 | 
						|
			vfov=118.2
 | 
						|
			diag=133.6
 | 
						|
			;;
 | 
						|
		3*)
 | 
						|
			hfov=35.7
 | 
						|
			vfov=62.2
 | 
						|
			diag=70.8
 | 
						|
			;;
 | 
						|
		esac
 | 
						|
		;;
 | 
						|
	esac
 | 
						|
 | 
						|
	flength=$(echo "$vfov/$hfov*$diag" | bc -l | head -n1 | cut -d "." -f1)
 | 
						|
	if [[ $1 == "" ]]; then
 | 
						|
		for video in *.MP4; do
 | 
						|
			name=$(echo "$video" | cut -d'.' -f1)_corrected
 | 
						|
			ffmpeg -i "$video" -vf "lenscorrection=cx=0.5:cy=0.5:k1=-0.$flength:k2=-0.022" -q:a 1 -q:v 1 -vcodec libx264 "$name".mp4
 | 
						|
		done
 | 
						|
	else
 | 
						|
		name=$(echo "$1" | cut -d'.' -f1)_corrected
 | 
						|
		ffmpeg -i "$1" -vf "lenscorrection=cx=0.5:cy=0.5:k1=-0.$flength:k2=-0.022" -q:a 1 -q:v 1 -vcodec libx264 "$name".mp4
 | 
						|
	fi
 | 
						|
}
 | 
						|
 | 
						|
function convert() {
 | 
						|
	if [[ $1 == "" ]]; then
 | 
						|
		for i in *.MP4; do
 | 
						|
			name=$(echo "$i" | cut -d'.' -f1)
 | 
						|
			echo "$name"
 | 
						|
			ffmpeg -i "$i" -q:a 1 -q:v 1 -vcodec mpeg4 "$name".mov
 | 
						|
		done
 | 
						|
	else
 | 
						|
		name=$(echo "$1" | cut -d'.' -f1)
 | 
						|
		echo "$name"
 | 
						|
		ffmpeg -i "$1" -q:a 1 -q:v 1 -vcodec mpeg4 "$name".mov
 | 
						|
	fi
 | 
						|
}
 | 
						|
 | 
						|
function convert-h265-to-h264 {
 | 
						|
        fileout="$(get-output-filename ${1} h264)"
 | 
						|
        ffmpeg -i "$1" -bsf:v h264_mp4toannexb -vcodec libx264 -c:a copy "$fileout"
 | 
						|
}
 | 
						|
 | 
						|
function slowmo() {
 | 
						|
	ffmpeg -i "$1" -r 25 -vf "setpts=($3/1)*PTS" -q:a 1 -q:v 1 -vcodec libx264 "$2"
 | 
						|
	echo "Video slowed down, use trim to trim the video"
 | 
						|
}
 | 
						|
 | 
						|
function speed() {
 | 
						|
	ffmpeg -i "$1" -r "$4" -vf "setpts=($3/1)*PTS" -q:a 1 -q:v 1 -vcodec libx264 "$2"
 | 
						|
	echo "finished $1"
 | 
						|
}
 | 
						|
 | 
						|
function trim() {
 | 
						|
	ffmpeg -i "$1" -ss "$3" -t "$4" -q:a 1 -q:v 1 -vcodec libx264 "$2"
 | 
						|
}
 | 
						|
 | 
						|
function merge() {
 | 
						|
	LIST_FILE="$(mktemp)"
 | 
						|
	printf "file '$PWD/%s'\n" *.MP4 > $LIST_FILE
 | 
						|
	ffmpeg -f concat -safe 0 -i $LIST_FILE -c copy "$1"
 | 
						|
	rm $LIST_FILE
 | 
						|
}
 | 
						|
 | 
						|
function rotate90deg {
 | 
						|
	fileout="$(get-output-filename ${1} rotated)"
 | 
						|
        # use 'transpose=2' for counter-clockwise
 | 
						|
        ffmpeg -i "$1" -filter:v transpose=1 -metadata:s:v rotate="" "$fileout"
 | 
						|
}
 | 
						|
 | 
						|
function stabilize() {
 | 
						|
	ffmpeg -i "$1" -vf deshake "$2"
 | 
						|
}
 | 
						|
 | 
						|
function sort() {
 | 
						|
	mkdir -p videos/{single,chaptered,thumbnails,lowresvideos}
 | 
						|
	mkdir -p photos/{single,timelapse-burst-continuous}
 | 
						|
	if [[ $1 == "move" ]]; then
 | 
						|
		mv GOPR*.MP4 videos/single
 | 
						|
		mv GP*.MP4 videos/chaptered
 | 
						|
		mv GOPR*.JPG photos/single
 | 
						|
		mv G*.JPG photos/timelapse-burst-continuous
 | 
						|
		mv ./*.LRV videos/lowresvideos
 | 
						|
		mv ./*.THM videos/thumbnails
 | 
						|
	else
 | 
						|
		cp -p GOPR*.MP4 videos/single
 | 
						|
		cp -p GP*.MP4 videos/chaptered
 | 
						|
		cp -p GOPR*.JPG photos/single
 | 
						|
		cp -p G*.JPG photos/timelapse-burst-continuous
 | 
						|
		cp -p ./*.LRV videos/lowresvideos
 | 
						|
		cp -p ./*.THM videos/thumbnails
 | 
						|
	fi
 | 
						|
	echo "Finished!"
 | 
						|
}
 | 
						|
 | 
						|
function wifiinfo() {
 | 
						|
	echo "is $(pwd) the root of your SD card?"
 | 
						|
	read -r
 | 
						|
	echo -ne "Enter current (default) wifi password: "
 | 
						|
	read -r defssid
 | 
						|
	echo -ne "Enter Wifi SSID: "
 | 
						|
	read -r wifissid
 | 
						|
	echo -ne "Enter password: "
 | 
						|
	read -r wifipassword
 | 
						|
	{
 | 
						|
		echo "$defssid"
 | 
						|
		echo "EVssidprimary,$wifissid"
 | 
						|
		echo "EVpassphrase,$wifipassword"
 | 
						|
	} >>gpauto
 | 
						|
	echo "Done. Insert SD card into the camera, remove battery, insert battery and power on twice."
 | 
						|
}
 | 
						|
 | 
						|
function update() {
 | 
						|
	curl https://raw.githubusercontent.com/KonradIT/gopro-linux/master/version
 | 
						|
	curl https://raw.githubusercontent.com/KonradIT/gopro-linux/master/gopro >/usr/bin/gopro
 | 
						|
}
 | 
						|
 | 
						|
function gif() {
 | 
						|
	convert -size "$1" ./*.JPG -delay 5 -resize "$1" "$2"
 | 
						|
}
 | 
						|
function proxy() {
 | 
						|
	if [[ $1 == "rename" ]]; then
 | 
						|
		mkdir lowres highres
 | 
						|
		mv ./*.MP4 highres/
 | 
						|
		mv ./*.LRV lowres/
 | 
						|
		for i in lowres/*.LRV; do
 | 
						|
			name=$(echo "$i" | cut -d'.' -f1)
 | 
						|
			mv "$i" "$name".MP4
 | 
						|
		done
 | 
						|
	fi
 | 
						|
	if [[ $1 == "move" ]]; then
 | 
						|
		mv highres/*.MP4 lowres/
 | 
						|
	fi
 | 
						|
}
 | 
						|
 | 
						|
function help() {
 | 
						|
	echo 'GoPro Tool for Linux OS
 | 
						|
Available commands:
 | 
						|
- gopro
 | 
						|
    >>Check for missing dependencies, e.g. ffmpeg, imagemagick and mencoder
 | 
						|
 | 
						|
- gopro timelapse [fps] [outfilename] [res width] [res height]
 | 
						|
		>>Makes a timelapse with pictures in the current folder, make sure to cd to a DCIM/XXXGOPRO folder!
 | 
						|
		>>Example: gopro timelapse 30 goproTL.mp4 1920 1080
 | 
						|
 | 
						|
- gopro superview
 | 
						|
		>>Applies SuperView to all GoPro videos in the current dir
 | 
						|
 | 
						|
- gopro fisheye
 | 
						|
		>>Fixes barrel distorsion to all GoPro pictures in the current folder
 | 
						|
 | 
						|
- gopro fisheye_video [video]
 | 
						|
		>>Fixes barrel distorsion on GoPro videos, [video] is optional, remove to apply to all mp4 videos in current dir
 | 
						|
		>>Also needs camera name input
 | 
						|
 | 
						|
- gopro convert
 | 
						|
		>>Converts all GoPro MP4 videos to MPEG4 MOV videos for easy editing
 | 
						|
 | 
						|
- gopro convert-h265-to-h264 [input_video]
 | 
						|
		>>Converts videos with h.265 codecs to h.264
 | 
						|
		>>This is useful for backwards compatibility. Some videos recorded on HERO Black 7 devices cannot be played on older hardware until codecs are converted.
 | 
						|
 | 
						|
- gopro slowmo [video]
 | 
						|
		>>Reduces the speed in a High FPS GoPro Video
 | 
						|
		>>Example: gopro slowmo GOPRO0553.MP4
 | 
						|
 | 
						|
- gopro trim [input video] [output video] [HH:MM:SS start] [HH:MM:SS end]
 | 
						|
		>>Trims a video to start and end times
 | 
						|
		>>Example: gopro trim GOPR0553.MP4 Trimmed.mp4 00:05:04 00:07:43
 | 
						|
 | 
						|
- gopro merge [output_video]
 | 
						|
		>>Merges all videos present in the current folder to [output_video]
 | 
						|
 | 
						|
- gopro rotate90deg [input_video]
 | 
						|
		>>Rotates video 90 degrees clockwise (edit "translate=2" argument for counter-clockwise)
 | 
						|
 | 
						|
- gopro stabilize
 | 
						|
		>>Stabilizes video
 | 
						|
		>>Example: gopro GOPRO0005.MP4 Stabilized.MP4
 | 
						|
 | 
						|
- gopro sort
 | 
						|
		>>Sorts media, please execute in DCIM/XXXGOPRO
 | 
						|
 | 
						|
- gopro wifiinfo
 | 
						|
		>>Sets Wifi SSID and Password for HERO5, 6, 7 cameras
 | 
						|
 | 
						|
- gopro gif
 | 
						|
		>>Makes gif from images in current dir
 | 
						|
		>>Example: gopro gif 800x600 animation.gif
 | 
						|
 | 
						|
- gopro proxy [option]
 | 
						|
		>>[rename] = renames .LRV to lowres/*.MP4
 | 
						|
		>>[move] = when finish editing, moves highres/*.MP4 to lowres/
 | 
						|
 | 
						|
- gopro update
 | 
						|
		>>Updates this script
 | 
						|
 | 
						|
- gopro help
 | 
						|
		>>show this usage message'
 | 
						|
}
 | 
						|
 | 
						|
echo "GoPro Tool for Linux"
 | 
						|
echo "To see a list of commands and syntax available run: gopro help"
 | 
						|
echo "Checking dependencies..."
 | 
						|
hash ffmpeg 2>/dev/null || { echo >&2 "ffmpeg ..... Not installed!"; }
 | 
						|
hash mogrify 2>/dev/null || { echo >&2 "mogrify ..... Not installed!"; }
 | 
						|
hash mencoder 2>/dev/null || { echo >&2 "mencoder ..... Not installed!"; }
 | 
						|
hash bc 2>/dev/null || { echo >&2 "bc ..... Not installed!"; }
 | 
						|
"$@"
 |