V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Triump
V2EX  ›  程序员

IOException: 断开的管道

  •  
  •   Triump · 2023-04-07 16:48:38 +08:00 · 917 次点击
    这是一个创建于 402 天前的主题,其中的信息可能已经有所发展或是发生改变。

    技术栈

    前端:react 、视频播放组件:video 标签 后端:springboot 、minio + aws-java-sdk-s3

    需求背景

    要做一个在 web 页面上播放视频的功能,一个视频文件大概在 150m 左右,通过单次下载然后播放显然行不通。因此采用 http 的 Range 请求头传入每次要下载的字节长度并返回 206 状态码的方案。

    Range 请求头相关知识

    请求头 Range: bytes=start-end 限制头部 例如( bytes=884736-) 限制尾部 ( bytes=-123456 ) 分段截取 (bytes=123456-884736) 获取第一个字节 0-0 响应头 Content-Range:bytes 0-200/3000 表示服务器返回了 0-200 个字节的数据,总共 3000 字节的数据。 Accept-Ranges:bytes 当浏览器发现 Accept-Ranges 头时,可以尝试继续中断了的下载,而不是重新开始。 Content-Type:video/mp4 表示资源类型,这里是 mp4 格式的视频 Content-Length:200 表示服务器此次返回数据是多少字节,这里是 200 字节

    后端接口逻辑

    根据 http 的请求头 range 获取本次要下载的 start 和 end ,然后用 s3 的分段下载 api 从 minio 获取所需文件: GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, objectName); getObjectRequest.withRange(start,end); amazonS3.getObject(getObjectRequest);

    前端逻辑

    通过 video 标签进行分段播放: <video ref={videoRef} // src={MINIO_RESOURCE_PREFIX + topData.file} src="https://.../api/file/download?fileName=sample-project/03d96ab16aac4571b4e7sbcb65ea1dae.mp4" {...videoJsOptions} ></video>

    遇到的问题

    浏览器在进行播放的过程中,发现后台日志一直报错:IOException: 断开的管道 ,最严重的是,偶尔会出现 服务假死的状态,即服务的进程还在,但是所有的接口访问不通。

    有哪位大佬遇到过类似的问题,可以指点一下方向吗?

    1 条回复    2023-04-07 20:17:11 +08:00
    ysc3839
        1
    ysc3839  
       2023-04-07 20:17:11 +08:00 via Android
    为什么要服务器转发?客户端直接请求不行吗?再者客户端不也是会自动分段下载吗?直接用现成的反代软件即可。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2989 人在线   最高记录 6547   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 15:13 · PVG 23:13 · LAX 08:13 · JFK 11:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.