IOException: 断开的管道

2023-04-07 16:48:38 +08:00
 Triump

技术栈

前端: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: 断开的管道 ,最严重的是,偶尔会出现 服务假死的状态,即服务的进程还在,但是所有的接口访问不通。

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

923 次点击
所在节点    程序员
1 条回复
ysc3839
2023-04-07 20:17:11 +08:00
为什么要服务器转发?客户端直接请求不行吗?再者客户端不也是会自动分段下载吗?直接用现成的反代软件即可。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/930616

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX