前端:react 、视频播放组件:video 标签 后端:springboot 、minio + aws-java-sdk-s3
要做一个在 web 页面上播放视频的功能,一个视频文件大概在 150m 左右,通过单次下载然后播放显然行不通。因此采用 http 的 Range 请求头传入每次要下载的字节长度并返回 206 状态码的方案。
请求头 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
ysc3839 2023-04-07 20:17:11 +08:00 via Android
为什么要服务器转发?客户端直接请求不行吗?再者客户端不也是会自动分段下载吗?直接用现成的反代软件即可。
|