Skip to content

v0.7.0 — Timelapse v2, H.265 muxing, dual-lens Xiaomi, release hardening

Choose a tag to compare

@mickeyzzc mickeyzzc released this 14 Jun 13:54
· 92 commits to main since this release

What's New

🎬 Timelapse v2 Pipeline

Complete rewrite of the timelapse system with dual-mode keyframe extraction and pure Go H.264/H.265 NAL→MP4 muxers — no FFmpeg required for timelapse generation.

  • Pure Go H.264/H.265 muxers — self-contained keyframe files without FFmpeg dependency
  • Rolling merge pipeline — H.264 and H.265 keyframes merged into timelapse videos automatically
  • Flexible merge durations — 8h / 12h / 24h / natural-day / 7d / 30d options
  • Unified recordings UI — timelapse recordings appear alongside regular recordings
  • Per-camera timelapse config — configurable interval, frame source, merge mode
  • Retry-merge API — manually trigger timelapse merge from the UI
  • Frontend — config editor, playback merge, gallery page

📹 Dual-Lens Xiaomi Camera Support

  • Select specific lens/channel on dual-camera Xiaomi devices (CW500, outdoor cam 4, etc.)
  • RTSP URL credential handling fix in test-connection

🔄 Transcoding

  • FFmpeg auto-download and job queue
  • Hardware transcoding (V4L2M2M / VAAPI / NVENC) with software fallback
  • NEW: VAAPI device verification — prevents runtime failures in Docker/VM without GPU passthrough
  • Batch backfill API for transcoding existing recordings
  • Transcoding history page with task status and retry

🧹 Dashboard UX Overhaul

  • Removed AI module (browser-side detection was incomplete; will return as dedicated feature)
  • Camera manager refactored — removed Enabled field, simplified UX
  • WebSocket decoder backpressure fix for stable multi-stream viewing

Bug Fixes

  • fix(transcoding): verify VAAPI device availability — hardware probe now checks /dev/dri/renderD* before selecting VAAPI encoder, falling back to libx264/libx265 when GPU is unavailable
  • fix(transcoding): FFmpeg status test isolation — tests no longer fail on machines with system FFmpeg installed (CI unblocked)
  • fix(web): WebSocket decoder backpressure — wired through Worker to ConnectionManager for stable streaming
  • fix(timelapse): rolling merge works for all recorder types — H.264, H.265, MJPEG
  • fix(timelapse): SPS/PPS cached in keyframe extractor — self-contained frame files
  • fix(camera): H.265 encoding detection — runtime recorder type used for keyframe extractor
  • fix(api): recording frames listing — includes H.264/H.265 timelapse frames
  • fix(i18n): missing translation keys — timelapse protocol, transcoding history action

Issues Resolved

  • #14 — Multi-lens device support + video quality (dual-lens via channel selection, transcoding for quality)
  • #15 — Docker test report (Docker path fix, Settings UI, FFmpeg transcoding, HLS recovery)
  • #18 — Xiaomi camera reconnect loop (PONG fix, backoff improvements, CS2 buffer drop)
  • #20 — H.265 HLS error/panic (muxer auto-recovery, StreamHub refactor)

Full Changelog: v0.6.0...v0.7.0

What's Changed

  • feat(timelapse): v2 timelapse pipeline + web improvements + transcoding by @mickeyzzc in #21
  • refactor(camera): remove Enabled field, improve UX, and clean up dead code by @mickeyzzc in #22
  • fix(api): RTSP credentials + feat(xiaomi): dual-lens channel support by @mickeyzzc in #23
  • fix(web): wire decoder backpressure through Worker to ConnectionManager by @mickeyzzc in #26
  • fix: v0.7.0 release fixes — VAAPI fallback, test isolation, README cleanup by @mickeyzzc in #27

Full Changelog: v0.6.0...v0.7.0