请教兄弟们一个关于服务器视频存储的问题

2023-01-11 15:05:46 +08:00
 horou

目前网站上是使用的 m3u8 的方式播放的视频

视频文件的存储是该如何存储呢,是存储 mp4 的源文件还是存储分片后的 m3u8 文件?

目前使用的是对象存储直接存储的 m3u8 文件,但是我发现对象存储还会根据请求数量收费,一个视频会被切分为几百上千个文件,感觉成本会很高啊。

还有如果我想提供一个用户下载视频的功能,该如何做,让下载下来的视频就是个 mp4 的文件

1923 次点击
所在节点    程序员
18 条回复
ysc3839
2023-01-11 15:09:16 +08:00
那就直接存 mp4
horou
2023-01-11 15:12:21 +08:00
@ysc3839 那该如何用 hls 的方式播放视频,服务端实时切片吗...
opengps
2023-01-11 15:18:55 +08:00
需要找个折中点,MP4 的不是按需请求,请求次数会少但是流量费可能会更高
learningman
2023-01-11 15:21:40 +08:00
MP4 的 range 请求请求数也不会少吧,还是说如果是 range 请求一个文件就算一次请求数?
dream4ever
2023-01-11 15:25:00 +08:00
我们公司的业务只有视频点播的需求,没有直播的需求也没有下载视频的需求,所以我写了一个 JS 脚本,调用 FFmpeg 对所有视频进行规范化处理,最后生成一个 m3u8 文件 + 一个 ts 文件传到云服务器上,Web 前端用 hls.js 播放。这个解决方案兼容性也 OK ,这几年一直用着。
biguokang
2023-01-11 15:27:33 +08:00
好奇问下什么场景下会使用 m3u8 格式储存视频文件,在我印象里 m3u8 要么就是用来做直播业务,要么就是一些流媒体平台用来规避视频窃取的风险,加大视频窃取难度。

如果没有这方面的需求,直接存 mp4 不是更好吗??

如果要我猜,你的做的网站是提供有版权视频的在线播放,所以用 m3u8 规避视频窃取(其实只是增加窃取操作成本,网络上一堆免费在线 m3u8 提取服务),然后付费用户则是可以直接下载 mp4 文件???
horou
2023-01-11 15:43:37 +08:00
@biguokang 这两个你都猜对了,还有就是视频播放时的缓冲速度相对 mp4 来说会快些
darling19961030
2023-01-11 15:45:48 +08:00
1. 网页播放 mp4 需要下载下来
2. 切分成 m3u8 是为了解决 1
3. ffmpeg 可以切分也可以合流,可以在下载 mp4 时先合并再下载
4. 或者搭建流媒体服务器,存储 mp4 ,网页播放时转为 m3u8
biguokang
2023-01-11 15:47:05 +08:00
不过如果网站是以在线视频为主的,那目前大多数的方案的确是 m3u8 为主。

可惜现在纯前端方案是没办法做 m3u8 converter mp4 工作的,这种目前只能在后端做,好在相关的后端库 github 一大堆,如果下载视频的使用量很大对于后端转换也是个负担。

如果这样只能建议视频存两份,一份存 m3u8 提供在线播放,一个存 mp4 提供下载。

想节省点空间资源的话,可以两种方案结合,如果这个视频从来没人下载,那么就一直是 m3u8 ,如果有第一个人下载,那就把该视频在后端转换成 mp4 然后传到云厂商的对象储存,以后下载该视频的人直接去取 mp4 就行了。
learningman
2023-01-11 15:59:06 +08:00
@biguokang #9 其实是可以的,ffmpeg 编译成 wasm 放到 webworker 里跑,生成的文件放进 indexedDB 再转成 Blob 给用户下载
考虑到 m3u8 转 mp4 完全就是拼接,其实也不会有太大开销。
ysc3839
2023-01-11 16:09:23 +08:00
@horou 不切不就好了?
@opengps 个人认为流量不会多,请求也不会更多,因为浏览器会用 range 请求。如果是 m3u8 切了,要对切片进行 range 请求,次数反而会变多,除非切得很碎,但是切太碎的话正常播放请求数也会变多。
有完整 mp4 下载需求的话还是别切好,省空间。
ysc3839
2023-01-11 16:11:55 +08:00
@horou 缓冲慢我怀疑是没有处理 mp4 。没记错的话普通的 mp4 是把一些元数据放在末尾的,浏览器播放时就要先请求头部,发现没有元数据再请求末尾,然后才能开始播放。处理过后元数据也在头部,就没有这种问题了。建议监控浏览器的请求看看是不是这个问题。
biguokang
2023-01-11 16:13:23 +08:00
等等,我倒是在 github 上找到了纯前端的方案,你可以参考下这个项目

https://github.com/Momo707577045/m3u8-downloader


看了下原理是用 mux.js 实现前端转码,你可以看看他的源码把有效部分 copy 下来,然后就能在纯前端实现转码了,不用耗费服务器资源
ysc3839
2023-01-11 16:16:13 +08:00
@dream4ever 只用一个 ts 的话相比 mp4 没有优势。mpegts 是把数据拆成一个个固定长度(188 字节)的数据包,每个包里面都有元数据,会让体积变大。
horou
2023-01-11 16:43:12 +08:00
@ysc3839 感谢详细的解答,我大概清楚怎么做了

@biguokang 非常感谢,回头我研究一下这个项目

@darling19961030 谢谢解答,不过搭建流媒体服务成本应该很高吧,暂时还是不考虑这个方案了
IvanLi127
2023-01-12 01:06:49 +08:00
一个 mp4 就好。不过建议看看新格式,从编码格式上减少体积,或许也有改善。 话说套 cdn 会不会更便宜点?
dream4ever
2023-01-12 11:08:23 +08:00
@ysc3839 对视频这块儿一直没有深入研究,公司阿里云服务器用的 Windows + IIS ,之前不知道遇到了什么问题,mp4 视频只能全部下载完之后才可以播放,当时大概研究了一下解决方案,就定下来用 m3u8 + ts 了,之后也一直没有再改。
ysc3839
2023-01-12 12:12:42 +08:00
@dream4ever 应该是我前面说的元数据在末尾的问题吧

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

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

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

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

© 2021 V2EX