diff --git a/comfy_api/latest/_input_impl/video_types.py b/comfy_api/latest/_input_impl/video_types.py index ae60603c4..f5af41973 100644 --- a/comfy_api/latest/_input_impl/video_types.py +++ b/comfy_api/latest/_input_impl/video_types.py @@ -743,6 +743,8 @@ class VideoFromFile(VideoInput): if to_skip >= resampled.samples: continue audio_started = True + if duration and frame_start > start_time: + duration_cap = min(duration_cap, math.ceil((start_time + duration - frame_start) * sample_rate)) if to_skip: pending_audio.append(audio_frame_from_ndarray(resampled.to_ndarray()[..., to_skip:])) continue diff --git a/tests-unit/comfy_api_test/video_types_test.py b/tests-unit/comfy_api_test/video_types_test.py index 49b53c6af..ae758bd40 100644 --- a/tests-unit/comfy_api_test/video_types_test.py +++ b/tests-unit/comfy_api_test/video_types_test.py @@ -487,6 +487,13 @@ def test_save_to_transcode_learns_unprobed_audio_params(): assert trimmed_before_audio["audio_codecs"] == [] assert trimmed_before_audio["audio_seconds"] is None + buffer.seek(0) + trimmed_crossing_audio = transcode_and_probe(VideoFromFile(buffer, start_time=11.5, duration=1)) + assert trimmed_crossing_audio["frames"] == fps + assert trimmed_crossing_audio["audio_codecs"] == ["aac"] + assert trimmed_crossing_audio["video_seconds"] == pytest.approx(1.0, abs=0.05) + assert trimmed_crossing_audio["audio_seconds"] == pytest.approx(0.5, abs=0.1) + def test_save_to_transcode_trimmed_fragmented_mp4_keeps_audio(): """Fragmented mp4 (MediaRecorder, DASH/HLS-derived files) delivers audio well behind