Java 实现大文件(视频)的高效下载,并让前端播放,有什么思路吗?

2023-02-16 11:12:57 +08:00
 Triump

需求背景:

要在网页上播放视频,视频是存储在文件系统( minIO )上,现在的做法是,前端请求后台的文件下载接口,将整个文件下载后返回给前端进行播放。但是这个视频大概有 140M ,整个过程耗时大概 1 分钟了。用户体验很差。

我的思路:

后端提供一个支持文件分片下载的方法,前端通过请求头设置 Range 参数传入指定的范围。比如一个 100M 的文件,每次请求 10M, 但是我不确定前端拿到这 10M 文件后,是否能够播放。。。 如果这个思路可行的话,前端需要用到哪些技术呢?

有没有大佬能够提供一下思路啊?

5081 次点击
所在节点    程序员
38 条回复
fiveStarLaoliang
2023-02-16 11:17:00 +08:00
走 nginx 转发不就行了,顶多加个鉴权,不需要自己去写切片播放
weixiaoyun
2023-02-16 11:17:04 +08:00
不用下载,minio 支持视频拉流的,给个视频预览源地址给前端播放器调用就好了
Triump
2023-02-16 11:22:35 +08:00
@weixiaoyun 就是让前端直接去访问 minio 吗?这样的话要把 桶的权限设置为公开,会不会很危险,因为这个项目要支持外网访问的。
tool2d
2023-02-16 11:28:39 +08:00
"但是我不确定前端拿到这 10M 文件后,是否能够播放"

本来就无法确定。

MP4 有两种格式,头格式和尾格式。头格式把具体播放信息都放在头部,可以流式播放。尾格式是把详细信息都放在文件末尾,你比如下载视频 BT ,必须把整个文件拖下来后,才能播放。

当然有工具可以在这两种格式之间切换。
MoonWalker
2023-02-16 11:29:48 +08:00
返回 206 状态码然后按 Range 解析字节范围就好了吧?
MoYi123
2023-02-16 11:30:10 +08:00
@Triump 用 presignedGetObjectUrl
registerrr
2023-02-16 11:31:00 +08:00
@Triump
不用,把桶权限设置成 download (共有读私有写)就行了

返回视频流时候你有业务要处理么?没有就是直接访问啊,前端只写个 video 标签都可以了
registerrr
2023-02-16 11:34:28 +08:00
要是访问也需要授权就用 6#的这个方法
duckyrain
2023-02-16 11:35:29 +08:00
走公有云 CDN ?
边下边播是视频格式决定的,和下载服务没关系。
Triump
2023-02-16 11:37:26 +08:00
@MoonWalker 我现在的思路就是这样,和前端小哥沟通了一下,他还不知道这种方式要怎么处理,所以不知道前端能不能去这个实现。
Triump
2023-02-16 11:38:41 +08:00
@registerrr 感谢,这个思路也可以。
okakuyang
2023-02-16 11:59:15 +08:00
边下边播要 Range 支持,不然苹果系可能播放不了。
niushuai
2023-02-16 13:31:03 +08:00
还是做切片比较合适
rqxiao
2023-02-16 13:39:41 +08:00
m3u8 文件
opengg
2023-02-16 13:44:47 +08:00
luob
2023-02-16 13:46:17 +08:00
后端调用 ffmpeg 切成 dash ,然后前端直接 plyr 播放器,都是成熟方案不用自己写什么
luob
2023-02-16 13:48:16 +08:00
唯一缺点是担心客户看到 plyr 播放器的界面会不有什么奇怪的反应(
spike76
2023-02-16 13:50:43 +08:00
用 ffmpeg 将 mp4 转成流格式
ffmpeg -i #{video_path} -codec: copy -start_number 0 -hls_time 16 -hls_list_size 0 -f hls #{hls_index_path}
每个小块文件只有 16 秒内容,前端下载应该足够快了
wxd21020
2023-02-16 13:53:35 +08:00
学习学习,看大佬们有啥解决方案
cheng6563
2023-02-16 14:16:33 +08:00
前端播放很难说的,你别看这些文件都是.mp4 ,其实内部差异大得很。
有必要的话还是要上 ffmpeg 重新封包(不是转码)

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

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

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

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

© 2021 V2EX