Software and resources for the MLO streaming video camera system.
The MLO streaming video camera system is a collection of software and hardware used to stream a near real-time high-resolution (4k) video stream of the night sky from the Mauna Loa Observatory (MLO) in Hawaii to YouTube.
The system consists of a digital camera connected to the computer via a Magewell capture card as well as a Raspberry Pi pico that monitors the temperature near the camera and can also control a relay to reset the camera when needed.
The code for the Raspberry Pi pico is in the pico-controller directory. See pico-controller below
for more details.
The streamcam.py script supports two sub-commands: stream and monitor.
The stream sub-command is used to start the streaming server. The monitor sub-command
is used to read the serial output from the pico-controller/main.py file.
Default parameters for both the commands can be specified in a .env file that should be created by the user. At a
minimum this should include the YouTube STREAM_KEY environment variable. See the Settings
section below for more details.
The system is controlled by supervisord, which starts both the
stream and monitor commands at system boot.
The stream command is started via the start-streamcam.sh script in order to also unload and
reload the linux usb drivers.
The requirements.txt file contains the python requirements for the scripts.
pip install -r requirements.txtTo use the supervisord.conf you must have supervisor installed:
sudo apt-get install supervisorThe supervisord.conf provided in the repo will start both the monitor and stream commands and
should be symlinked into the main supervisord configuration directory:
sudo ln -s $PWD/streamcam-supervisord.conf /etc/supervisor/conf.d/Note: The
streamcam-supervisord.conffile assumes your username ispanoptesand your home directory is/home/panoptes. If this is different then alter the above file for your correct username and home directory.
The streamcam script has default settings contained in the settings.py file. These can be
overridden by setting environment variables in a .env file that you create in the root directory of the repo.
The .env file should contain your YouTube STREAM_KEY as well as any other settings you want to override.
For example, to change the default framerate to 30 fps and buffer size to 2M, create a .env file in the same
directory with the following contents:
STREAM_KEY=your-stream-key
FRAMERATE=30
BUF_SIZE=2MSee the settings.py file for a list of all the available settings.
You can run the program via the streamcam.py file, using the stream and monitor subcommands.
python streamcam.py streamThe video stream is being done by ffmpeg via the ffmpeg-ptyhon
wrapper.
Options for ffmpeg are controlled via environment variables. See the settings section below.
The script overlays two text files onto the video, the banner.txt in the lower
left corner and the time.txt in the lower right.
The banner.txt file can be updated manually and will update in the video as soon as the file is saved. If the
environment variable DEBUG=true then the contents of .env (except the STREAM_KEY) will be displayed instead of the banner.
The time.txt file is updated automatically by the monitor sub-command.
python streamcam.py streamThe monitor sub-command reads the serial output from the pico-controller/main.py file and
stores it locally as pico-log.json text file. It also updates the time.txt file with the current time and the
current temperature.
There is also a bash script that will unload and load the linux kernel module before starting the script, which can be helpful for freezing video.
Note that the bash script does assume the user is named panoptes and has a hard-coded python path. You may need to
adjust as necessary.
bash start-stream.shWhen running in automatic mode, the system is controlled by supervisord, which is responsible for running
both the stream and the monitor described above. To control the system you should use supervisorctl instead
of calling the scripts directly.
If you need to manually restart the service call the below two commands:
sudo supervisorctl stop stream
sudo supervisorctl start streamNote that it takes a few seconds for stop stream to kill all the ffmpeg processes and for some reason using supervisorctl restart stream doesn't wait, so the camera gets jammed. Always use the explicit stop/start.
The pico controls the relays and reads the temperature from inside the camera box.
See the README.