dotfiles/.bin/OLD/gopro
2024-02-14 07:55:58 +01:00

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