目前网站上是使用的 m3u8 的方式播放的视频
视频文件的存储是该如何存储呢,是存储 mp4 的源文件还是存储分片后的 m3u8 文件?
目前使用的是对象存储直接存储的 m3u8 文件,但是我发现对象存储还会根据请求数量收费,一个视频会被切分为几百上千个文件,感觉成本会很高啊。
还有如果我想提供一个用户下载视频的功能,该如何做,让下载下来的视频就是个 mp4 的文件
1
ysc3839 2023-01-11 15:09:16 +08:00 via Android
那就直接存 mp4
|
3
opengps 2023-01-11 15:18:55 +08:00
需要找个折中点,MP4 的不是按需请求,请求次数会少但是流量费可能会更高
|
4
learningman 2023-01-11 15:21:40 +08:00
MP4 的 range 请求请求数也不会少吧,还是说如果是 range 请求一个文件就算一次请求数?
|
5
dream4ever 2023-01-11 15:25:00 +08:00
我们公司的业务只有视频点播的需求,没有直播的需求也没有下载视频的需求,所以我写了一个 JS 脚本,调用 FFmpeg 对所有视频进行规范化处理,最后生成一个 m3u8 文件 + 一个 ts 文件传到云服务器上,Web 前端用 hls.js 播放。这个解决方案兼容性也 OK ,这几年一直用着。
|
6
biguokang 2023-01-11 15:27:33 +08:00
好奇问下什么场景下会使用 m3u8 格式储存视频文件,在我印象里 m3u8 要么就是用来做直播业务,要么就是一些流媒体平台用来规避视频窃取的风险,加大视频窃取难度。
如果没有这方面的需求,直接存 mp4 不是更好吗?? 如果要我猜,你的做的网站是提供有版权视频的在线播放,所以用 m3u8 规避视频窃取(其实只是增加窃取操作成本,网络上一堆免费在线 m3u8 提取服务),然后付费用户则是可以直接下载 mp4 文件??? |
8
darling19961030 2023-01-11 15:45:48 +08:00 1
1. 网页播放 mp4 需要下载下来
2. 切分成 m3u8 是为了解决 1 3. ffmpeg 可以切分也可以合流,可以在下载 mp4 时先合并再下载 4. 或者搭建流媒体服务器,存储 mp4 ,网页播放时转为 m3u8 |
9
biguokang 2023-01-11 15:47:05 +08:00
不过如果网站是以在线视频为主的,那目前大多数的方案的确是 m3u8 为主。
可惜现在纯前端方案是没办法做 m3u8 converter mp4 工作的,这种目前只能在后端做,好在相关的后端库 github 一大堆,如果下载视频的使用量很大对于后端转换也是个负担。 如果这样只能建议视频存两份,一份存 m3u8 提供在线播放,一个存 mp4 提供下载。 想节省点空间资源的话,可以两种方案结合,如果这个视频从来没人下载,那么就一直是 m3u8 ,如果有第一个人下载,那就把该视频在后端转换成 mp4 然后传到云厂商的对象储存,以后下载该视频的人直接去取 mp4 就行了。 |
10
learningman 2023-01-11 15:59:06 +08:00
@biguokang #9 其实是可以的,ffmpeg 编译成 wasm 放到 webworker 里跑,生成的文件放进 indexedDB 再转成 Blob 给用户下载
考虑到 m3u8 转 mp4 完全就是拼接,其实也不会有太大开销。 |
11
ysc3839 2023-01-11 16:09:23 +08:00 via Android
|
12
ysc3839 2023-01-11 16:11:55 +08:00 via Android 1
@horou 缓冲慢我怀疑是没有处理 mp4 。没记错的话普通的 mp4 是把一些元数据放在末尾的,浏览器播放时就要先请求头部,发现没有元数据再请求末尾,然后才能开始播放。处理过后元数据也在头部,就没有这种问题了。建议监控浏览器的请求看看是不是这个问题。
|
13
biguokang 2023-01-11 16:13:23 +08:00 1
等等,我倒是在 github 上找到了纯前端的方案,你可以参考下这个项目
https://github.com/Momo707577045/m3u8-downloader 看了下原理是用 mux.js 实现前端转码,你可以看看他的源码把有效部分 copy 下来,然后就能在纯前端实现转码了,不用耗费服务器资源 |
14
ysc3839 2023-01-11 16:16:13 +08:00 via Android
@dream4ever 只用一个 ts 的话相比 mp4 没有优势。mpegts 是把数据拆成一个个固定长度(188 字节)的数据包,每个包里面都有元数据,会让体积变大。
|
15
horou OP @ysc3839 感谢详细的解答,我大概清楚怎么做了
@biguokang 非常感谢,回头我研究一下这个项目 @darling19961030 谢谢解答,不过搭建流媒体服务成本应该很高吧,暂时还是不考虑这个方案了 |
16
IvanLi127 2023-01-12 01:06:49 +08:00 via Android
一个 mp4 就好。不过建议看看新格式,从编码格式上减少体积,或许也有改善。 话说套 cdn 会不会更便宜点?
|
17
dream4ever 2023-01-12 11:08:23 +08:00
@ysc3839 对视频这块儿一直没有深入研究,公司阿里云服务器用的 Windows + IIS ,之前不知道遇到了什么问题,mp4 视频只能全部下载完之后才可以播放,当时大概研究了一下解决方案,就定下来用 m3u8 + ts 了,之后也一直没有再改。
|
18
ysc3839 2023-01-12 12:12:42 +08:00 via Android
@dream4ever 应该是我前面说的元数据在末尾的问题吧
|