请教兄弟们一个关于服务器视频存储的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
horou
V2EX    程序员

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

  •  
  •   horou 2023-01-11 15:05:46 +08:00 2592 次点击
    这是一个创建于 1026 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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

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

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

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

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


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

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

    @darling19961030 谢谢解答,不过搭建流媒体服务成本应该很高吧,暂时还是不考虑这个方案了
    IvanLi127
        16
    IvanLi127  
       2023-01-12 01:06:49 +08:00 via Android
    一个 mp4 就好。不过建议看看新格式,从编码格式上减少体积,或许也有改善。 话说套 cdn 会不会更便宜点?
    dream4ever
        17
    dream4ever  
       2023-01-12 11:08:23 +08:00
    @ysc3839 对视频这块儿一直没有深入研究,公司阿里云服务器用的 Windows + IIS ,之前不知道遇到了什么问题,mp4 视频只能全部下载完之后才可以播放,当时大概研究了一下解决方案,就定下来用 m3u8 + ts 了,之后也一直没有再改。
    ysc3839
        18
    ysc3839  
       2023-01-12 12:12:42 +08:00 via Android
    @dream4ever 应该是我前面说的元数据在末尾的问题吧
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2821 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 13:05 PVG 21:05 LAX 05:05 JFK 08:05
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86