diff --git a/media-api/main.py b/media-api/main.py index c971f37..9b6274b 100644 --- a/media-api/main.py +++ b/media-api/main.py @@ -746,18 +746,21 @@ def stream_transcoded(request: Request, file_id: str, start_time: float = 0.0): time_start_sec = (byte_start / estimated_total_bytes) * video_duration time_start_sec = max(0.0, min(time_start_sec, video_duration - 0.5)) - # For seeking, don't limit duration - stream to end - # The browser will handle buffering - duration_sec = None # None means stream to end - # Update headers for range response # For seeking, we typically don't know the exact end, so estimate actual_byte_end = min(byte_end or estimated_total_bytes - 1, estimated_total_bytes - 1) headers["Content-Range"] = f"bytes {byte_start}-{actual_byte_end}/{estimated_total_bytes}" headers["Content-Length"] = str(actual_byte_end - byte_start + 1) + + # Honor the requested range: approximate duration based on bitrate so the + # transcoded response length matches the declared Content-Length. + requested_bytes = actual_byte_end - byte_start + 1 + duration_sec = requested_bytes * 8 / transcoded_bitrate if transcoded_bitrate else None + if duration_sec is not None: + # Clamp to remaining duration. + duration_sec = max(0.0, min(duration_sec, video_duration - time_start_sec)) # Stream from the calculated time position using FFmpeg's -ss flag - # Duration is None, so it will stream to the end return StreamingResponse( generate_transcoded_stream(p, time_start_sec, duration_sec), media_type=content_type, diff --git a/video-remote/src/components/VideoModal.tsx b/video-remote/src/components/VideoModal.tsx index 9cc652a..d7545b0 100644 --- a/video-remote/src/components/VideoModal.tsx +++ b/video-remote/src/components/VideoModal.tsx @@ -52,7 +52,10 @@ export const VideoModal: React.FC = ({ fileId, onClose }) => { sources: [ { src: src, - type: 'video/mp4' + // Do not hardcode the MIME type: the "regular" endpoint may serve + // non-mp4 containers (avi/mkv/etc), and forcing mp4 can trigger + // MEDIA_ERR_SRC_NOT_SUPPORTED in Video.js/browser. + // Let Video.js/browser sniff based on the actual response. } ] })