V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
simonlu9
V2EX  ›  程序员

问下大家短视频实现秒开一般用什么方案的

  •  
  •   simonlu9 · 2020-03-06 09:23:14 +08:00 · 10446 次点击
    这是一个创建于 1748 天前的主题,其中的信息可能已经有所发展或是发生改变。

    新到的公司要搞短视频,之前没搞过这块,现在用 h5 搞发现切换总是有延迟,卡个两三秒,看过大厂的做法都是自己定义播放 sdk,预加载,本地代理,但实在是时间有限,问下有没有一些开源方案。

    57 条回复    2021-08-25 10:59:25 +08:00
    opengps
        1
    opengps  
       2020-03-06 09:25:19 +08:00
    视频源服务器的带宽多大?如果带宽够大你不做预加载都感觉不到慢多少
    yorkyoung
        2
    yorkyoung  
       2020-03-06 09:31:35 +08:00
    预加载
    simonlu9
        3
    simonlu9  
    OP
       2020-03-06 09:40:46 +08:00
    @opengps 用的是腾讯云视频的 sdk,应该不存在带宽问题
    laminux29
        4
    laminux29  
       2020-03-06 09:40:48 +08:00
    说白了就是钱的问题。

    大厂是就近 CDN,并且 CDN 整套后台都是 C++。

    小厂既没有 CDN,又是蜗牛 java 后台,速度怎么会快。
    delectate
        5
    delectate  
       2020-03-06 09:42:00 +08:00
    先说结论:h5 做不到。

    再说原理:根据你的选择,生成一个动态的列表,因为你只有三个选择:上一个、下一个、退出。
    只要预加载下一个就行了。
    simonlu9
        6
    simonlu9  
    OP
       2020-03-06 09:46:00 +08:00
    @delectate 我也觉得 h5 做不到,提供的 api 根本做不到上面的优化,如果又改善,估计只有用原生的 api
    lzihua
        7
    lzihua  
       2020-03-06 10:36:31 +08:00
    @delectate H5 做不到 只能原生 预加载下一个视频
    ETiV
        8
    ETiV  
       2020-03-06 10:41:22 +08:00 via iPhone
    不信 h5 做不到
    但是 iOS 不让纯 webview 的 app 上架
    afpro
        9
    afpro  
       2020-03-06 10:41:22 +08:00
    @laminux29 感觉你对 java 有误解。。。。。。
    lihailewodeji
        10
    lihailewodeji  
       2020-03-06 10:42:50 +08:00
    @laminux29 这和后台什么语言有什么关系
    Jooooooooo
        11
    Jooooooooo  
       2020-03-06 10:44:34 +08:00
    预加载
    xsen
        12
    xsen  
       2020-03-06 10:48:31 +08:00
    是否秒开,跟采用的语言,是不是 h5 没有关系。关键是流媒体传输的方式,若是传统的直播类协议,如 hls、rtmp 这些,延迟 2-3s 是正常的情况

    若要秒开,可以直接基于 rtp/rtcp 进行传输,或者采用 webrtc 这样的方式
    GM
        13
    GM  
       2020-03-06 10:49:28 +08:00
    @laminux29 你这都什么年代的观念了,keep learning 啊同学。
    fgodt
        14
    fgodt  
       2020-03-06 10:56:53 +08:00 via Android
    预加载 H5 使用 MSE 喂数据就可以了 不过需要自己开发个播放器
    fancy111
        15
    fancy111  
       2020-03-06 11:15:59 +08:00
    啥的秒开不秒开啊,很多用的障眼法而已。 要么就是带宽管够。
    efaun
        16
    efaun  
       2020-03-06 11:28:01 +08:00
    @laminux29 #4 你这个观念还停留在上个世纪 80 年代吧
    KuroNekoFan
        17
    KuroNekoFan  
       2020-03-06 11:30:30 +08:00
    hls 分片越小响应速度越快吧,tradeoff,衡量一下呗
    simonlu9
        18
    simonlu9  
    OP
       2020-03-06 11:33:10 +08:00
    @KuroNekoFan 试过 m3u8,对比过不明显
    tongyang
        19
    tongyang  
       2020-03-06 12:00:23 +08:00
    预加载,还有就是可以根据当前带宽加载不同码率的,一般为了 kpi 前三秒都是地滑知的
    tongyang
        20
    tongyang  
       2020-03-06 12:00:28 +08:00
    低画质
    surewen
        21
    surewen  
       2020-03-06 12:01:47 +08:00   ❤️ 1
    秒开很简单,预加载数据就行。不够快就预解封装、解码,还不够快就再加上预渲染
    sobigfish
        22
    sobigfish  
       2020-03-06 12:38:43 +08:00
    h5 一样可以预加载啊 可以把视频 切 2 片,前部分 2~3s 预加载,2~3s 耗费又不大,在播放这部分时加载下一部分
    DoveAz
        23
    DoveAz  
       2020-03-06 13:18:17 +08:00   ❤️ 1
    https://demo.doveaz.xyz/ 5m 小水管,别点下一个太快,就不卡,使用了高端大气的障眼法技术
    tengyoubiao
        24
    tengyoubiao  
       2020-03-06 13:37:10 +08:00 via Android
    @DoveAz 都挤进去,加载不出来了
    rrfeng
        25
    rrfeng  
       2020-03-06 13:59:22 +08:00
    楼上基本上没说到点子上的。
    如果是公司业务的话,直接去找你们的 CDN 提供商,他们可以给你提供建议和支持。
    zyEros
        26
    zyEros  
       2020-03-06 14:36:27 +08:00
    H5 可以做到的,比如这个: http://h5.haohuimai1.com/#/
    使用了 WXInlinePlayer 这个库
    Semidio
        27
    Semidio  
       2020-03-06 16:03:24 +08:00
    DASH
    laminux29
        28
    laminux29  
       2020-03-06 17:27:42 +08:00   ❤️ 1
    @afpro

    没误解。

    每种语言都有自己的优劣,在这个问题上,java 就是劣势。
    laminux29
        29
    laminux29  
       2020-03-06 17:29:00 +08:00   ❤️ 1
    @lihailewodeji

    有关系。

    C++与 Java 存在性能上的较为显著的差异,特别是在视频处理上,这种差异会被放大。
    laminux29
        30
    laminux29  
       2020-03-06 17:30:57 +08:00   ❤️ 1
    @GM

    无论什么年代,C++与 Java 在性能问题上都存在差异,这是语言特性注定的。

    你让我 keep learning,我倒想问问你,jre 各版本与 C++在变量自增这个简单问题上的性能差距是多少,你有没有跟踪过?
    laminux29
        31
    laminux29  
       2020-03-06 17:34:04 +08:00   ❤️ 1
    @efaun

    那你把最新世纪,最新年代,最新版本的 jre 或 jdk,与 C++在变量自增这个简单问题上的性能差距,做个简单的性能对比测试?
    luffyt
        32
    luffyt  
       2020-03-06 17:42:33 +08:00
    @laminux29 看视频需要处理视频么??
    itmyhome126
        33
    itmyhome126  
       2020-03-06 17:44:58 +08:00
    @laminux29 看你说了这么多, 你倒是贴个对比图啊, 是你说 java 慢的
    laminux29
        34
    laminux29  
       2020-03-06 17:57:43 +08:00
    @luffyt

    你是不是觉得,在线看视频的本质,就是浏览器下载视频文件?

    建议你有空做个在线播放器,包括后台的那种,你就知道这玩意水有多深了。
    laminux29
        35
    laminux29  
       2020-03-06 17:59:15 +08:00
    @itmyhome126

    我把关键都说了,居然还要我去贴图,你咋不上天呢?
    luffyt
        36
    luffyt  
       2020-03-06 18:33:44 +08:00
    @laminux29 我看抖音也是直接返视频文件地址的,带水印的、不带水印的等等
    GM
        37
    GM  
       2020-03-06 21:33:28 +08:00
    @laminux29
    我不会去跟踪这种见树木不见森林的行为。
    你说的这种场景叫做“计算密集型”,楼主说的这种场景属于“IO 密集型”,跟你一个自变量自增速度基本没关系。
    GM
        38
    GM  
       2020-03-06 21:37:31 +08:00
    @laminux29 水再深,也不会影响播放速度。影响速度最大的原因在于网速,也就是 IO,而不是什么变量自增速度快慢。

    楼主碰到的问题,根源在于他没有做“预加载”,跟后台是 C 艹还是 C 井还是 Java 基本没关系。
    wdlth
        39
    wdlth  
       2020-03-06 22:28:07 +08:00
    可以通过一个小文件预载起始的部分,Google Developers 有说明:
    https://developers.google.com/web/fundamentals/media/fast-playback-with-video-preload
    ljpCN
        40
    ljpCN  
       2020-03-07 00:54:54 +08:00 via Android
    CDN+转码+预加载?
    FS1P7dJz
        41
    FS1P7dJz  
       2020-03-07 01:43:59 +08:00
    每个视频有个预览图
    预览图直接在滑下一个的瞬间弹出来
    之后才播放视频
    视频提前缓冲到本地
    mumbler
        42
    mumbler  
       2020-03-07 06:42:40 +08:00 via Android
    视频多长,体积多大? mp4 有一个 head,必须加载完 head 数据才能开始播放,所以越小视频 head 小,开播速度越快。把视频压缩小一些,用质量换速度
    linhongye
        43
    linhongye  
       2020-03-07 09:09:54 +08:00 via Android
    前端去预加载, 后端不用改
    leonme
        44
    leonme  
       2020-03-07 10:03:30 +08:00 via iPhone
    CDN
    预加载
    newmlp
        45
    newmlp  
       2020-03-07 11:12:58 +08:00
    秒开只能预加载
    laminux29
        46
    laminux29  
       2020-03-07 15:23:08 +08:00
    @luffyt

    1.直接返回一个文件地址很正常。

    2.抖音的视频,和优酷、爱奇艺相比,有什么特点?
    laminux29
        47
    laminux29  
       2020-03-07 15:29:07 +08:00
    @GM

    你还是先做个视频播放器,再来谈这些问题吧,不然你现在什么经验都没有,评论全靠想象力?
    GM
        48
    GM  
       2020-03-07 15:58:44 +08:00
    @laminux29
    你怎么知道我没做过视频播放器?
    直播确实没做过,本地播放做过(基于开源项目修修改改就成了自己用的了)。
    然后呢?卡几秒跟后台是 C 艹还是 Java 有一毛钱关系吗?

    我估计你的意思是“在线转码对计算量要求非常高,所以只有 C 艹才能胜任”。
    afeicool
        49
    afeicool  
       2020-03-07 17:15:45 +08:00
    @laminux29 小兄弟,慎言啊
    laminux29
        50
    laminux29  
       2020-03-07 17:45:34 +08:00
    @GM 这里是讨论 h5 网页播放器,不是本地播放器。
    laminux29
        51
    laminux29  
       2020-03-07 17:45:58 +08:00
    @afeicool 一个技术问题有啥慎不慎言的。
    GM
        52
    GM  
       2020-03-07 21:26:35 +08:00
    @laminux29 大神,你做过什么牛逼项目,说说嘛。别告诉我还在读大学哦
    geekvcn
        53
    geekvcn  
       2020-03-08 05:39:41 +08:00 via Android
    限制 h5 的话,最简单的方式就是 quic
    aguesuka
        54
    aguesuka  
       2020-03-08 09:40:52 +08:00 via Android
    我干过摄像头的项目,在我走后安卓端改从 rtsp 改成 hls(理论 rtsp 更快但是既然选择了 hls 那说明 h5 是可以接受的),mp4 的视频放在 cdn 上,加上视频清晰度不高只给内部用,按照同事的说法就是秒开。
    aguesuka
        55
    aguesuka  
       2020-03-08 09:53:34 +08:00 via Android
    @simonlu9 hls 协议是下一个.ts 和.m3u8 文件,第一段视频的 io 时间就是两次 http 请求,你把每段视频的大小控制在 1m 试试?可以用 ffmpeg 推流到 nginx 上,环境搭起来很简单,选择合适的参数,全程只要部署改配置文件运行。
    aguesuka
        56
    aguesuka  
       2020-03-08 10:42:54 +08:00
    https://s2.ax1x.com/2020/03/08/3vRQfA.jpg
    https://s2.ax1x.com/2020/03/08/3vRKFH.jpg

    hls 如果提前分包后台就不需要解码,后台就是个静态 http 服务器,甚至你可以把视频全扔给 cdn。视频的延迟完全取决于服务器带宽和用户的网速。
    flanche
        57
    flanche  
       2021-08-25 10:59:25 +08:00
    m3u8
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3391 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 10:58 · PVG 18:58 · LAX 02:58 · JFK 05:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.