You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask流媒体视频渲染:视频跳转至指定时间点功能实现咨询

Fixing Video Seek Issues in Flask: Step-by-Step Guide

Hey Benji, let's tackle this video seek problem you're facing. I've run into similar issues when serving videos with Flask, so here's what you need to know and how to fix it:

First: Understand How Video Seek Works

First off, you don't need a dedicated API endpoint for basic progress bar seek functionality—the HTML5 <video> element handles the seek logic on the front-end, but it relies on your Flask server supporting a specific HTTP feature: Range requests.

When you drag the progress bar to a timestamp (like 10 minutes), your browser sends a Range header to the server asking for a specific chunk of the video file (e.g., bytes=600000- for the part starting at 10 minutes). If your server doesn't respond correctly to this request, the video won't jump.

Common Causes & Fixes

1. Your Flask Server Isn't Handling Range Requests

By default, Flask's built-in static file server doesn't support Range requests. That's the most likely culprit here. To fix this, you'll need to create a custom route to serve your videos and handle these requests manually.

Here's a working example of a Flask route that supports Range requests:

from flask import Flask, request, Response
import os
from werkzeug.datastructures import Headers

app = Flask(__name__)

@app.route('/serve-video/<filename>')
def serve_video(filename):
    # Path to your video directory
    video_dir = os.path.join(app.root_path, 'static', 'videos')
    video_path = os.path.join(video_dir, filename)

    if not os.path.exists(video_path):
        return "Video not found", 404

    file_size = os.path.getsize(video_path)
    range_header = request.headers.get('Range')

    if range_header:
        # Parse the range header (format: bytes=start-end)
        start, end = range_header.split('=')[1].split('-')
        start = int(start)
        end = int(end) if end else file_size - 1
        chunk_size = end - start + 1

        # Read the requested chunk from the video file
        with open(video_path, 'rb') as f:
            f.seek(start)
            video_chunk = f.read(chunk_size)

        # Build the response headers for partial content
        headers = Headers()
        headers.add('Content-Range', f'bytes {start}-{end}/{file_size}')
        headers.add('Accept-Ranges', 'bytes')
        headers.add('Content-Length', str(chunk_size))
        headers.add('Content-Type', 'video/mp4') # Adjust based on your video format

        # Return partial content (status code 206)
        return Response(video_chunk, status=206, headers=headers)
    else:
        # Return the full video if no range is requested
        return Response(open(video_path, 'rb').read(), mimetype='video/mp4')

2. Update Your Front-End Video Tag

Point your <video> element to this custom route instead of the direct static file path:

<video controls width="800">
    <source src="/serve-video/my-video.mp4" type="video/mp4">
    Your browser doesn't support HTML5 video.
</video>

3. Verify the Fix with Browser Dev Tools

  • Open your browser's DevTools (F12) and go to the Network tab.
  • Drag the video progress bar to a new timestamp. You should see a new request to /serve-video/... with a Range header, and the server should respond with a 206 Partial Content status code.
  • If you see a 200 OK instead, that means your server isn't handling the Range request correctly—double-check the route code.

4. Check Video File Compatibility

If the above fixes don't work, verify that your video file is encoded correctly. Some poorly encoded videos won't support seeking even with a proper server setup. Test with a known-good video file (like a sample MP4 from a trusted source) to rule this out.

When Would You Need an API for Seek?

You only need a dedicated API endpoint if:

  • You're serving dynamically generated videos (e.g., real-time transcoding).
  • You need to enforce authentication/authorization before allowing video access.
  • You're using advanced streaming protocols like HLS or DASH (which require additional server-side setup).

For standard static video files, the Range request support is all you need.

内容的提问来源于stack exchange,提问作者Benji

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:19:21