Browse Source

fix for video

main
Domagoj Zecevic 2 days ago
parent
commit
09f883ca88
  1. 24
      .claude/settings.local.json
  2. 18
      internal/video/stream.go

24
.claude/settings.local.json

@ -24,7 +24,29 @@
"Bash(ffmpeg -loglevel warning -ss 0 -i /home/dzecevic/repos/CamMonitor/footage/record/A260520_153838_153852.265 -vframes 1 -vf scale=160:90:force_original_aspect_ratio=decrease -f image2 -vcodec mjpeg /tmp/test_thumb.jpg)", "Bash(ffmpeg -loglevel warning -ss 0 -i /home/dzecevic/repos/CamMonitor/footage/record/A260520_153838_153852.265 -vframes 1 -vf scale=160:90:force_original_aspect_ratio=decrease -f image2 -vcodec mjpeg /tmp/test_thumb.jpg)",
"Bash(ffmpeg -loglevel error -i /home/dzecevic/repos/CamMonitor/footage/record/A260520_153838_153852.265 -ss 0 -vframes 1 -vf scale=160:90:force_original_aspect_ratio=decrease -f image2 -vcodec mjpeg /tmp/test_thumb2.jpg)", "Bash(ffmpeg -loglevel error -i /home/dzecevic/repos/CamMonitor/footage/record/A260520_153838_153852.265 -ss 0 -vframes 1 -vf scale=160:90:force_original_aspect_ratio=decrease -f image2 -vcodec mjpeg /tmp/test_thumb2.jpg)",
"Bash(mv /home/dzecevic/repos/CamMonitor/footage/images/* /home/dzecevic/repos/CamMonitor/footage/20260520/images/)", "Bash(mv /home/dzecevic/repos/CamMonitor/footage/images/* /home/dzecevic/repos/CamMonitor/footage/20260520/images/)",
"Bash(mv /home/dzecevic/repos/CamMonitor/footage/record/* /home/dzecevic/repos/CamMonitor/footage/20260520/record/)" "Bash(mv /home/dzecevic/repos/CamMonitor/footage/record/* /home/dzecevic/repos/CamMonitor/footage/20260520/record/)",
"Bash(FOOTAGE_ROOT=./footage DB_PATH=/tmp/cam-debug.db ADMIN_USER=admin ADMIN_PASS=admin go run ./cmd/server)",
"Bash(FOOTAGE_ROOT=./footage DB_PATH=/tmp/cam-debug.db ADMIN_USER=admin ADMIN_PASS=admin go run ./cmd/server --listen :8081)",
"Bash(echo \"Server PID: $!\")",
"Bash(pkill -f \"go run ./cmd/server\")",
"Bash(FOOTAGE_ROOT=./footage DB_PATH=/tmp/cam-debug2.db LISTEN_ADDR=:18081 ADMIN_USER=admin ADMIN_PASS=admin go run ./cmd/server)",
"Bash(curl -s -c /tmp/cam-cookie.txt -b /tmp/cam-cookie.txt -X POST http://127.0.0.1:18081/login -d 'username=admin&password=admin' -L -o /dev/null -w '%{http_code}')",
"Bash(curl -s -c /tmp/cam-cookie.txt -b /tmp/cam-cookie.txt -X POST http://127.0.0.1:18081/login -H 'Content-Type: application/x-www-form-urlencoded' -d 'username=admin&password=admin' -D - -o /dev/null)",
"Bash(python3 -c 'import urllib.parse; print\\(urllib.parse.quote\\('\\\\''20260520/record/A260520_153838_153852.265'\\\\'', safe='\\\\''/'\\\\''\\)\\)')",
"Bash(curl -v -s -c /tmp/cam-cookie.txt -b /tmp/cam-cookie.txt http://127.0.0.1:18081/thumb/video/__CMDSUB_OUTPUT__ -o /tmp/thumb-response.bin)",
"Bash(curl -v -s -c /tmp/cam-cookie.txt -b /tmp/cam-cookie.txt http://127.0.0.1:18081/stream/video/20260520/record/A260520_153838_153852.265 --max-time 5 -o /tmp/stream-response.bin)",
"Bash(xxd /tmp/stream-response.bin)",
"Bash(curl -s -c /tmp/cam-cookie.txt -b /tmp/cam-cookie.txt http://127.0.0.1:18081/day/20260520/videos)",
"Bash(ffprobe *)",
"Bash(ffmpeg -encoders)",
"Bash(time ffmpeg -loglevel error -i /home/dzecevic/repos/CamMonitor/footage/20260520/record/A260520_153838_153852.265 -t 5 -c:v libx264 -preset ultrafast -crf 28 -an -movflags frag_keyframe+empty_moov -f mp4 /tmp/test_transcode.mp4)",
"Bash(FOOTAGE_ROOT=./footage DB_PATH=/tmp/cam-debug3.db LISTEN_ADDR=:18082 ADMIN_USER=admin ADMIN_PASS=admin go run ./cmd/server)",
"Bash(curl -s -c /tmp/cam-cookie2.txt -b /tmp/cam-cookie2.txt -X POST http://127.0.0.1:18082/login -H 'Content-Type: application/x-www-form-urlencoded' -d 'username=admin&password=admin' -o /dev/null)",
"Bash(curl -s -c /tmp/cam-cookie2.txt -b /tmp/cam-cookie2.txt http://127.0.0.1:18082/stream/video/20260520/record/A260520_153838_153852.265 --max-time 8 -o /tmp/stream_h264.mp4)",
"Bash(pkill -f \"cam-debug\")",
"Bash(ffmpeg -loglevel error -i /home/dzecevic/repos/CamMonitor/footage/20260520/record/A260520_153838_153852.265 -c:v libx264 -preset ultrafast -crf 28 -pix_fmt yuv420p -an -movflags frag_keyframe+empty_moov -f mp4 /tmp/stream_h264.mp4)",
"Bash(ffmpeg -loglevel error -i footage/20260520/record/A260520_153838_153852.265 -c:v libx264 -preset ultrafast -crf 28 -pix_fmt yuv420p -an -movflags frag_keyframe+empty_moov -f mp4 /tmp/stream_h264.mp4)",
"Bash(echo \"exit:$?\")"
] ]
} }
} }

18
internal/video/stream.go

@ -21,7 +21,23 @@ func Stream(w http.ResponseWriter, r *http.Request, absPath, ffmpegPath string)
ffmpegPath, ffmpegPath,
"-loglevel", "error", "-loglevel", "error",
"-i", absPath, "-i", absPath,
"-c:v", "copy", // Transcode H.265 → H.264 for universal browser support.
// Firefox and Chrome on Linux/Windows cannot decode H.265 at all;
// stream-copying the HEVC bitstream into MP4 produces a file the
// <video> element silently refuses to play.
//
// ultrafast minimises CPU time on slow hardware (Intel Atom).
// crf 28 trades a little quality for faster encode and smaller output.
// yuv420p converts from the camera's yuvj420p (full-range JPEG colour
// space) to the standard limited-range H.264 expected by browsers;
// without this the picture looks washed out.
// -an drops the audio track; security camera clips rarely carry useful
// audio and stripping it halves the work for the encoder.
"-c:v", "libx264",
"-preset", "ultrafast",
"-crf", "28",
"-pix_fmt", "yuv420p",
"-an",
"-movflags", "frag_keyframe+empty_moov", "-movflags", "frag_keyframe+empty_moov",
"-f", "mp4", "-f", "mp4",
"pipe:1", "pipe:1",

Loading…
Cancel
Save