V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
horou
V2EX  ›  程序员

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

  •  
  •   horou · Jan 11, 2023 · 2795 views
    This topic created in 1202 days ago, the information mentioned may be changed or developed.

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

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

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

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

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

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

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

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

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

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

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


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

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

    @darling19961030 谢谢解答,不过搭建流媒体服务成本应该很高吧,暂时还是不考虑这个方案了
    IvanLi127
        16
    IvanLi127  
       Jan 12, 2023 via Android
    一个 mp4 就好。不过建议看看新格式,从编码格式上减少体积,或许也有改善。 话说套 cdn 会不会更便宜点?
    dream4ever
        17
    dream4ever  
       Jan 12, 2023
    @ysc3839 对视频这块儿一直没有深入研究,公司阿里云服务器用的 Windows + IIS ,之前不知道遇到了什么问题,mp4 视频只能全部下载完之后才可以播放,当时大概研究了一下解决方案,就定下来用 m3u8 + ts 了,之后也一直没有再改。
    ysc3839
        18
    ysc3839  
       Jan 12, 2023 via Android
    @dream4ever 应该是我前面说的元数据在末尾的问题吧
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   940 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 42ms · UTC 21:36 · PVG 05:36 · LAX 14:36 · JFK 17:36
    ♥ Do have faith in what you're doing.