Chrome 浏览器中的视频标签在查找随机位置的进度条时请求不正确的范围。Firefox 运行完美

Video Tag in Chrome Browser requesting incorrect range when seeking progress bar to random location. Firefox is working flawlessly

提问人:Kanha Rusia 提问时间:3/26/2023 最后编辑:Kanha Rusia 更新时间:11/17/2023 访问量:132

问:

我有 FASTAPI 服务器,可以服务器部分内容,响应状态 206。

@video_router.get("/video/file/{folder}/{name}")
async def video_endpoint(folder: str, name: str, range: str = Header(None)):
    CHUNK_SIZE = 2048*2048
    video_path = Path(f"./media/{folder}/{name}")
    video_size = video_path.stat().st_size
    start, end = range.replace("bytes=", "").split("-")
    start = int(start)
    if start + CHUNK_SIZE > video_size:
        end = video_size
    else:
        end = start + CHUNK_SIZE

    with open(video_path, "rb") as video:
        video.seek(start)
        data = video.read(end - start)
        headers = {
            'Content-Range': f'bytes {start}-{end}/{video_size}',
            'Accept-Ranges': 'bytes'
        }
        return Response(data, status_code=206, headers=headers, media_type="video/mp4")

从 react 前端,我请求此 URL 以提供部分内容。

<video
          controlsList="nodownload"
          key="abc"
          width="100%"
          height="100%"
          poster={poster_url}
          controls
          src={video_url}
          type="video/mp4"
          preload="metadata"
        />

这在 firefox 浏览器中可以完美运行,但在 Google Chrome 中,当我向后或向前寻找任何位置的进度条时。视频播放器挂起/卡住。播放暂停/播放按钮后,视频从头开始播放,即字节=0-。

在调试这个在标头中传递的范围参数时,我注意到 chrome 浏览器请求了不正确的字节,即 bytes=INCORRECT_NUMBER-。此外,该INCORRECT_NUMBER对于进度条中的任何位置都是相同的。请查看以下图片。

IMAGE1:时间等于 15 秒,但请求的字节数是结束字节数

图像 2:时间等于 2:54 分钟,但请求的字节数是与上一个图像相同的结束字节数

执行此操作后,如您所见,视频标签不再从 FASTAPI 服务器请求任何数据。

我尝试更改标题、其他 react-video 播放器和 iframe 标签。

我希望通过提供部分内容的 fastapi 服务器流式传输视频。非常感谢对视频标签的替代或解决方法的建议。

javascript google-chrome 视频流 html5-video fastapi

评论

0赞 Mick 3/28/2023
问题似乎出在客户端 - 我认为如果您共享更多客户端代码供人们查看会有所帮助,或者如果您有测试站点的链接,甚至更好

答:

0赞 Kanha Rusia 11/17/2023 #1

video_size - 1 结束 - 开始 + 1

需要进行以上修改。