diff options
Diffstat (limited to 'bin/gpctl')
| -rwxr-xr-x | bin/gpctl | 153 |
1 files changed, 0 insertions, 153 deletions
diff --git a/bin/gpctl b/bin/gpctl deleted file mode 100755 index a92c65a..0000000 --- a/bin/gpctl +++ /dev/null @@ -1,153 +0,0 @@ -#!/bin/env python3 - -import argparse -import logging -import sys -import signal -import subprocess -import datetime -import os.path -import time -import urllib.request, urllib.parse -from goprocam import GoProCamera, constants - -# setup logging facilities -logging.basicConfig(level=logging.INFO) - - -def setup_cam(dev='gp0'): - logging.info(f"Connecting to gopro camera at {dev}") - return GoProCamera.GoPro(ip_address=GoProCamera.GoPro.getWebcamIP(dev), - mac_address='0e:7c:80:b5:82:0e', - camera=constants.gpcontrol, - webcam_device=dev) - - -def configure_cam(gp, - resolution="720p", - fps="60", - fov="0", - autooff=constants.Setup.AutoOff.Never): - gp.video_settings(resolution, fps) - gp.gpControlSet(constants.Setup.AUTO_OFF, autooff) - - -def take_photo(gp, outdir='.'): - logging.info('Snapping picture!') - mediauri = gp.take_photo() - medianame = os.path.basename(urllib.parse.urlparse(mediauri).path) - outpath = os.path.join(outdir, medianame) - logging.info(f"Saving to {outpath}") - urllib.request.urlretrieve(mediauri, filename=outpath) - - -def webcam(gp, - resolution=constants.Webcam.Resolution.R720p, - fov=constants.Webcam.FOV.Wide): - # prepare v4l2 device - logging.info('Creating v4l2 device node') - v4l2p = subprocess.run([ - 'doas -n modprobe v4l2loopback && doas -n v4l2loopback-ctl add -n GoPro -x 1 || true' - ], - shell=True, - check=True, - capture_output=True) - vnode = v4l2p.stdout.decode('utf-8').strip() - - logging.info(f'Starting webcam mode ({vnode})') - gp.webcamFOV(fov=fov) - gp.startWebcam(resolution=resolution) - - try: - # gracefull handle sigterm - def sigterm_handler(sig, frame): - raise SystemExit('SIGTERM') - - signal.signal(signal.SIGTERM, sigterm_handler) - # pipe video from camera to v4l2 device - udp_stream = f"udp://{gp.getWebcamIP()}:8554" - ffmpeg_args = [ - f"ffmpeg -hide_banner -loglevel warning -vsync 2 -fflags nobuffer -flags low_delay -probesize 3072 -nostdin -i {udp_stream} -ar 44100 -f v4l2 -vcodec rawvideo -pix_fmt yuv420p {vnode}" - ] - logging.info('Running ffmpeg') - subprocess.run(ffmpeg_args, shell=True, check=True) - except (KeyboardInterrupt, SystemExit, Exception): - # allow camera to shut down - time.sleep(1) - # stop webcam mode - logging.info('Stopping webcam mode') - gp.stopWebcam() - subprocess.run([f"doas -n v4l2loopback-ctl del {vnode}"], - shell=True, - check=True) - # done - logging.info('Exiting...') - - -parser = argparse.ArgumentParser(description='gopro cli utility') -parser.add_argument('-o', - '--output-directory', - type=str, - default=['.'], - help='Directory to save files to.') -parser.add_argument('-r', - '--resolution', - nargs=1, - type=str, - choices=('1080p', '720p', '420p'), - default='1080p', - help='Video resolution') -# parser.add_argument('-f', -# '--fps', -# type=str, -# default=['60'], -# help='Video frame rate') -parser.add_argument('-v', - '--fov', - type=str, - choices=('wide', 'linear', 'narrow'), - default=['wide'], - help='Video field of view') - -group = parser.add_mutually_exclusive_group() -group.add_argument('--take-photo', - action='store_true', - help='Take a photo and save it to OUTPUT.') -group.add_argument('--webcam', - action='store_true', - help='Start webcam mode and register as v4l2 device') - -args = parser.parse_args() - -res = constants.Webcam.Resolution.R720p -if args.resolution: - if args.resolution == '1080p': - res = constants.Webcam.Resolution.R1080p - elif args.resolution == '720p': - res = constants.Webcam.Resolution.R720p - elif args.resolution == '480p': - res = constants.Webcam.Resolution.R480p - -fov = constants.Webcam.FOV.Wide -if args.fov: - if args.fov == 'wide': - fov = constants.Webcam.FOV.Wide - elif args.fov == 'linear': - fov = constants.Webcam.FOV.Linear - elif args.fov == 'narrow': - fov = constants.Webcam.FOV.Narrow - -# get camera network device from environment -# should be up and connected (with an ip address assigned) -gp = setup_cam(os.getenv('GOPRO_DEVICE', 'gp0')) -# configure_cam(gp, resolution=args.resolution, fps=args.fps, fov=args.fov) - -try: - if args.take_photo: - take_photo(gp, outdir=args.output_directory[0]) - if args.webcam: - webcam(gp, resolution=res, fov=fov) - -except Exception as err: - logging.error(f"error: {err}") - exit(1) |