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