Add pure-ffmpeg RTSP capture and camera audio for sunrise videos
Removes dependency on MotionEye or any NVR software. Everything is now
CLI/ffmpeg configured entirely from sky-cam.conf.
capture.sh
Long-running systemd service (one per camera) that pulls frames from the
camera's RTSP stream at CAPTURE_INTERVAL seconds, writing HH-MM-SS.jpg
into BASE_DIR/<cam>/YYYY-MM-DD/. Restarts at midnight for the new date
directory; auto-reconnects on camera disconnect.
sunrise-audio-capture.sh
One-shot service triggered at 03:00. Waits until (sunrise minus
SUNRISE_PRE_MIN minus AUDIO_PRE_BUFFER_MIN), then records the RTSP audio
stream for the full sunrise window. Output deleted after mixing.
daily_sunrise_video.sh
Step 3 now mixes in sunrise-audio.m4a when AUDIO_ENABLED=true and the
file exists. Audio is centred on actual sunrise time at natural speed
while the video plays as the sped-up timelapse. Uses filter_complex
when audio is present (can't combine -vf with -filter_complex).
install.sh
Generates sky-cam-capture-<cam>.service for each camera with CAM_RTSP_<cam>
set, and sky-cam-audio-capture.{service,timer} when AUDIO_ENABLED=true.
sky-cam.conf
New settings: CAM_RTSP_<cam>, CAPTURE_INTERVAL, AUDIO_ENABLED,
AUDIO_PRE_BUFFER_MIN, CAPTURE_AUDIO_BITRATE.
https://claude.ai/code/session_01C4jbd3waXG3eKZYbGUjLUQ
This commit is contained in:
@@ -12,11 +12,11 @@ Automated sky / timelapse camera scripts that produce:
|
||||
|
||||
| Dependency | Notes |
|
||||
|---|---|
|
||||
| `ffmpeg` + `ffprobe` | Encoding and duration probing |
|
||||
| `ffmpeg` + `ffprobe` | Encoding, capture, audio recording, duration probing |
|
||||
| `python3` | `ephem` package for sunrise calculation, `requests` for Mattermost upload |
|
||||
| `bc` | Shell arithmetic (floating-point speed factors) |
|
||||
| `fontconfig` (`fc-match`) | Font detection for overlays — optional, falls back to hardcoded paths |
|
||||
| Camera software | e.g. `motion` — writes JPEG images named `HH-MM-SS.jpg` into `BASE_DIR/<cam>/<YYYY-MM-DD>/` |
|
||||
| IP camera with RTSP stream | `capture.sh` pulls frames directly — no NVR software needed |
|
||||
| Vivaldi Four Seasons audio | 12 MP3 files named so that `*Spring*Mvt*1*`, `*Summer*Mvt*2*`, etc. match with `find -iname` |
|
||||
|
||||
Install Python dependencies:
|
||||
@@ -60,6 +60,8 @@ Minimum settings to fill in (everything else has sensible defaults):
|
||||
| `CAMERAS` | Space-separated list of camera names, e.g. `(sunrise north)` |
|
||||
| `SUNRISE_CAM` | Which camera faces east and gets the sunrise job |
|
||||
| `LATITUDE` / `LONGITUDE` / `TIMEZONE` | Your location for sunrise calculation |
|
||||
| `CAM_RTSP_<cam>` | RTSP stream URL for each camera, e.g. `rtsp://admin:pass@192.168.1.100:554/stream1` |
|
||||
| `CAPTURE_INTERVAL` | Seconds between captured frames (default: 10) |
|
||||
| `mattermost_url` / `access_token` / `channel_id` | Mattermost upload credentials |
|
||||
|
||||
### 3. Install systemd timers
|
||||
@@ -84,12 +86,24 @@ journalctl --user -u sky-cam-sunrise.service -f
|
||||
## How it works
|
||||
|
||||
```
|
||||
Camera writes JPEGs
|
||||
Camera RTSP stream
|
||||
│
|
||||
├─ capture.sh <cam> (long-running systemd service, one per camera)
|
||||
│ ffmpeg pulls one frame every CAPTURE_INTERVAL seconds
|
||||
│ Writes: BASE_DIR/<cam>/YYYY-MM-DD/HH-MM-SS.jpg
|
||||
│ Restarts at midnight for the new date directory; auto-reconnects
|
||||
│
|
||||
├─ sunrise-audio-capture.sh (runs at 03:00, waits for sunrise window)
|
||||
│ ffmpeg records audio-only from RTSP during sunrise window
|
||||
│ Writes: BASE_DIR/<cam>/YYYY-MM-DD/sunrise-audio.m4a
|
||||
│ Deleted automatically after being mixed into the sunrise video
|
||||
│
|
||||
Camera JPEGs + audio
|
||||
│
|
||||
├─ daily_sunrise_video.sh (runs at SCHEDULE_SUNRISE)
|
||||
│ Step 1: encode raw video from sunrise-window JPEGs
|
||||
│ Step 2: speed-adjust to SUNRISE_TARGET_SECS → saved permanently
|
||||
│ Step 3: burn sunrise time overlay → final video
|
||||
│ Step 3: burn sunrise time overlay + mix camera audio (if available)
|
||||
│ OnSuccess → sunrise2mm.py uploads to Mattermost
|
||||
│
|
||||
├─ 4-seasons.sh <cam> (runs at SCHEDULE_SEASONS_<cam>, processes yesterday)
|
||||
@@ -134,6 +148,18 @@ You receive notifications for:
|
||||
|
||||
---
|
||||
|
||||
## Camera audio (optional)
|
||||
|
||||
If your camera has a microphone, sky-cam can mix a natural-speed 10-second audio clip (birds, rain, wind — whatever was actually happening at sunrise) into the daily sunrise video.
|
||||
|
||||
1. Set `AUDIO_ENABLED=true` in `sky-cam.conf`
|
||||
2. Set `CAM_RTSP_<cam>` for the sunrise camera (needed for both image capture and audio)
|
||||
3. Re-run `./install.sh` to generate the `sky-cam-audio-capture.timer`
|
||||
|
||||
The audio is recorded during the same window as the images, stored alongside them, and deleted automatically after being mixed into the final video. No audio library or AI required — it's the real sound from your camera.
|
||||
|
||||
---
|
||||
|
||||
## Manual operations
|
||||
|
||||
**Re-run today's sunrise** (e.g. after fixing a font issue):
|
||||
@@ -157,6 +183,12 @@ You receive notifications for:
|
||||
./year-end-join.sh 2025 sunrise
|
||||
```
|
||||
|
||||
**Check capture status**:
|
||||
```bash
|
||||
systemctl --user status sky-cam-capture-sunrise.service
|
||||
journalctl --user -u sky-cam-capture-sunrise.service -f
|
||||
```
|
||||
|
||||
**Check logs**:
|
||||
```bash
|
||||
journalctl --user -u sky-cam-sunrise.service
|
||||
|
||||
Reference in New Issue
Block a user