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!"; }
 | |
| "$@"
 | 
