From 1a04cab1d6bf06bf248a5acddc485d0b10b4bf85 Mon Sep 17 00:00:00 2001 From: Stu Leak Date: Tue, 16 Dec 2025 23:24:29 -0500 Subject: [PATCH] Fix snippet duration accuracy with stream copy mode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Improves snippet timing accuracy for Default Format mode by: - Adding -accurate_seek flag for precise keyframe seeking - Changing from -t (duration) to -to (end time) for better accuracy - Adding -avoid_negative_ts make_zero to fix timestamp issues with problematic containers like WMV This should resolve issues where snippets were 1:20 or 0:21 instead of the configured length (e.g., 10s). Stream copy still uses keyframe-level precision but should now be much closer to target duration. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 --- main.go | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/main.go b/main.go index c790249..97c94db 100644 --- a/main.go +++ b/main.go @@ -3367,15 +3367,19 @@ func (s *appState) executeSnippetJob(ctx context.Context, job *queue.Job, progre if useSourceFormat { // Source format mode: Use stream copy for clean extraction // Note: This uses keyframe cutting, so duration may not be frame-perfect + // Calculate end time for more accurate cutting + endTime := center + float64(snippetLength) args = []string{ "-y", "-hide_banner", "-loglevel", "error", + "-accurate_seek", // Seek accurately to keyframes "-ss", start, "-i", inputPath, - "-t", fmt.Sprintf("%d", snippetLength), - "-c", "copy", // Stream copy - no re-encoding - "-map", "0", // Include all streams + "-to", fmt.Sprintf("%.2f", endTime), // Use -to instead of -t for better accuracy + "-c", "copy", // Stream copy - no re-encoding + "-map", "0", // Include all streams + "-avoid_negative_ts", "make_zero", // Fix timestamp issues outputPath, } } else {