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

请教视频转码边转边播技术

  •  
  •   albin504 · 1 天前 · 3863 次点击

    https://help.aliyun.com/zh/oss/live-transcoding

    需求是这样:视频上传到对象存储之后,能够让用户尽快可播放。 这里涉及到视频转码,有两种主流方案:

    1 、离线转码。 视频上传后,利用 ffmpeg 实现离线转码。特点是转码耗时太久,1 小时 1080P 视频完成转码要 45 秒以上(使用 GPU 硬件资源的情况下,如果使用 cpu 更慢)。意味着用户上传完视频之后不能立马播放

    2 、实时转码。 用户边播边转,实现几乎零延迟。

    目前遇到的问题是:在阿里云不提供服务的国家,像 aws 、google 这些云厂商不提供边转边播能力,只有离线转码。

    问题: 1 、如果自建边转边播能力,难度大吗? 有成熟的技术栈吗? 2 、是否有一些其他的付费方案(比如购买一套实时转码服务)可选择?

    57 条回复    2025-09-10 00:36:29 +08:00
    cheng6563
        1
    cheng6563  
       1 天前
    ffmpeg 本身就能开端口在线转码啊
    lpe234
        2
    lpe234  
       1 天前
    有些想法可能不太适合,可以参考下:

    1. 是否可以通过非技术手段,让用户等待下。比如 提示用户转码/审核中?
    2. 是否可以先转码几分钟,用来做视频预览。等全部转码完毕后,再提供完整播放
    3. m3u8 那个也不算特别实时吧。之前有个需求要在网页播放 RTSP 视频流,我就用 ffmpeg 转码成 ts 文件播放的。

    `自建边转边播能力,难度大` 这个我感觉难度可能在于并发量和计算资源使用率上面。 我那需求就几个摄像头,CPU 转也没太大压力
    cccn
        3
    cccn  
       1 天前
    ningxing
        4
    ningxing  
       1 天前
    搜索下分片技术,可以实现你要的效果
    ETiV
        5
    ETiV  
       1 天前 via iPhone
    没看懂你这个场景到底是直播还是点播
    nginx 有个 rtmp 模块,用它入门最简单了
    wzy44944
        6
    wzy44944  
       1 天前
    实现上不复杂,你发的那个链接里就有技术细节,就是生成 hls 格式让播放器播放。
    需要在存储系统和播放器之间加一层代理,做 m3u8 的生成和触发 ffmpeg 转 ts
    1. 播放开始时,根据视频时长,预先把 m3u8 生成吐出来给播放器
    2. 播放到哪个 ts 就计算下在视频中的位置,触发这个位置之后的转码
    可以把 ts 的大小调到 10s ~ 15s 左右,这样保证每次拖动进度,开播时间在 1s 甚至几百 ms 以内。
    wang9571
        7
    wang9571  
       1 天前
    AWS 不是有 MediaLive 服务可以转码吗
    wjx0912
        8
    wjx0912  
       1 天前
    plex 的用户量可能最多,个人喜欢 jellyfin 。看你用户量有多大
    lambdaq
        9
    lambdaq  
       1 天前
    楼上说的 m3u8 就是你要的吧。原理是 1 小时 1080P 视频完成转码要 45 秒以上,但是你截取 10s 一小段转码上传不需要 45 秒啊。你就一小段一小段的转
    capric
        10
    capric  
       1 天前
    mediamtx 和 ZLMediaKit 可以支持很多协议实时转码
    https://github.com/bluenviron/mediamtx
    https://github.com/ZLMediaKit/ZLMediaKit
    wangxiaoer
        11
    wangxiaoer  
       1 天前 via iPhone
    把视频文件转成直播格式是不是算边转边播,ffmpeg 支持把视屏转成 hls 吧
    albin504
        12
    albin504  
    OP
       1 天前
    @ETiV 点播。类似于用户在爱奇艺上传一个视频,上传完成后可立马进行播放
    albin504
        13
    albin504  
    OP
       1 天前
    @lpe234 嗯,产品体验层面,产品不需要等待太久
    albin504
        14
    albin504  
    OP
       1 天前
    @wang9571 谢谢提供的信息。

    AWS Elemental MediaLive 是 AWS 提供的一项 实时视频处理服务,主要用于将实时视频流( live video )进行编码、转码和打包,然后分发给观众。它属于 AWS 媒体服务( AWS Media Services ) 生态的一部分,常用于 直播( live streaming )场景。

    说这个常用于直播场景,我们的需求是在线点播,不知道是否是同一种技术?
    albin504
        15
    albin504  
    OP
       1 天前
    @capric 谢谢,这个看起来也是直播技术。 能详细说一说,要满足我们的实时点播场景的需求,这个开源项目该如何使用吗? 或者有文档吗
    albin504
        16
    albin504  
    OP
       1 天前 via Android
    @wangxiaoer 支持转成 hls ,问题是这个过程太慢(转成 hls 前要先转码,因为 hls 支持的编码有限,对于不支持的编码必须先转码)
    albin504
        17
    albin504  
    OP
       1 天前 via Android
    @wzy44944 谢谢!思路很好能满足需求,如果有来源实现就好了
    xmumiffy
        18
    xmumiffy  
       1 天前 via Android
    先切片再转,如果改不了 m3u8 ,那就转完再合并
    wnpllrzodiac
        19
    wnpllrzodiac  
       1 天前 via Android
    网盘支持在线播放都是这么搞的。动态生成 ts 切片。
    albin504
        20
    albin504  
    OP
       1 天前
    @wnpllrzodiac 了解。动态生成 ts 切片,有成熟的开源方案推荐吗
    BlueSkyXN
        21
    BlueSkyXN  
       1 天前
    “1 、离线转码。 视频上传后,利用 ffmpeg 实现离线转码。特点是转码耗时太久,1 小时 1080P 视频完成转码要 45 秒以上(使用 GPU 硬件资源的情况下,如果使用 cpu 更慢)。意味着用户上传完视频之后不能立马播放”


    不是哥们,这都算慢???????? 那只能切片处理,更不好
    keepongjl
        22
    keepongjl  
       1 天前
    @BlueSkyXN 感觉这转码的速度还是比较快的,而且业务系统上传的视频可定会有转码、审核的流程
    npe
        23
    npe  
       1 天前
    m3u8 或者 fmp4 就可以了
    albin504
        24
    albin504  
    OP
       1 天前
    @ETiV rtmp 模块,我问了 chatgpt:

    Nginx-rtmp 侧重“直播式”产 HLS:它是线性往前切片。若希望“用户拖到 10 分钟处就从那里开始即时打包”,并且不用实时等,建议引入:
    • nginx-vod-module ( Kaltura 开源):对 H.264/AAC 的 MP4 做 按需打包成 HLS/DASH (不转码,只重打包,几乎秒开与秒拖)。
    • 若上传编码不统一,需要 后台转码一版通用 H.264/AAC ,再由 nginx-vod 做即时打包 —— 这是很多点播平台的常见组合。

    他这个回复对不? rtmp 无法实现用户拖到 10 分钟处就从那里开始即时播放。
    jackOff
        25
    jackOff  
       1 天前
    转码分片缓存呢?比如有些资源几乎无人访问就只保留源文件,热资源就长期保存 ffmpeg 转码好的不同规格的分片,这是服务器,或者你让客户端自己去 ffmpeg 去转
    jiames1969
        26
    jiames1969  
       1 天前
    先给原视频播放,转码成功换成新视频。
    wangtian2020
        27
    wangtian2020  
       1 天前
    不要转码!不要转码! 原格式转发,客户自己转去
    8355
        28
    8355  
       1 天前   ❤️ 1
    可以了解一下火山引擎的智能转码策略
    播放量高才触发异步转码,转码的意义有 2 个 一个是降低播放卡顿和一个是省播放流量。
    转码和尽快可播放并不冲突,你的 1 和 2 都需要考虑到业务高峰期的算力,估计你是达不到的。
    高清直播业务也是用客户端硬件做视频流编码预处理,既然无法做到客户端预处理只能考虑异步转码,cdn 顶住未转码这部分事件的播放流量。
    zhmouV2
        29
    zhmouV2  
       1 天前   ❤️ 1
    只有我的想法是,,,显示上传进度的时候,延长 45s 吗?
    Admstor
        30
    Admstor  
       1 天前   ❤️ 3
    希望程序员永远不要只用技术脑袋思考业务问题

    第一
    用户上传进度条并不一定需要用真实进度条,可以在最后加入编码时间的进度等待,这里用户并不需要知道,只需要告诉用户正在上传,请保持在上传页面,你 1 小时视频转码只要 45 秒,但是对于用户来说,上传用 1 分钟还是 1 分 45 秒,都可以接受。

    第二
    现在设备端解码能力很强,如果你再编码只是解决宽带和存储压力,那么客户本身预览就可以直接给预览原文件,但是稍后正式推送给其他客户的时候,使用重编码的文件

    切片等细节楼上很多朋友都说了
    lance07
        31
    lance07  
       1 天前
    为什么必须要先转码才能放?刚上传不会立马大量访问吧
    onebitbank
        32
    onebitbank  
       1 天前
    有一个开源的工具,实现了浏览器端视频转码,https://github.com/Vanilagy/mediabunny ,你可以试试
    chengzhi
        33
    chengzhi  
       1 天前
    ZLMediaKit
    newbie111
        34
    newbie111  
       1 天前
    ffmpeg 先切一个两分钟的出来给用户播放( mp4 或 m3u8 )的同时进行转码,播放过程中请求 api 查询完整 m3u8 是否已切片号,api 确认切片完成后返回地址,播放器根据已播放时间跳转到指定 ts 文件位置。
    dusu
        35
    dusu  
       1 天前 via iPhone
    你要的是 ngx_vod_module
    ragnaroks
        36
    ragnaroks  
       22 小时 46 分钟前
    https://bunny.net/stream/ 实时谈不上,大概几分钟的延迟
    COW
        37
    COW  
       18 小时 23 分钟前
    可以上传后,先提供低清晰度的版本,这样转码速度很快,不需要几十秒;高清晰度的后台异步处理就行了
    albin504
        38
    albin504  
    OP
       18 小时 23 分钟前
    @Admstor 谢谢。
    第一,是目前产品从交互层面认同的方案,可采纳。但不是完美的方案,会导致用户上传视频明显变慢。

    第二: 上传视频文件后在客户端播放是可以利用本地设备的解码能力。 但是,产品层面支持用户上传文件后,通过 h5 链接把视频分享给其他用户,其他用户打开链接后,需要跳转回客户端进行播放。 这里如果使用重编码的文件,同样也是需要用户等待转码完成才允许分享
    pc10201
        39
    pc10201  
       18 小时 15 分钟前
    用实时音视频或超低延时直播,支持边放边播边录
    albin504
        40
    albin504  
    OP
       18 小时 13 分钟前
    @Admstor 谢谢大家的建议,综合大家的信息,目前倾向于这么解决:
    以下方案结合起来使用:
    ( 1 )上传进度条中,加入编码时间的进度等待。 这样,不管后续云端是对视频内容全部转码,还是切片按需转码,用户体验上都是整体没问题的
    ( 2 )云端转码方案:会实现一套离线转码(目前已开发完成)作为兜底方案。同时,再去开发一套
    @wzy44944 这位老哥提供的按需切片转码的方案。 项目上线后,如果按需转码效果还可以,就切到按需转码方案。否则就切换到"内容全部转码"方案。 从客户端的角度,播放 API 是一致的,都是获取到 m3u8 链接就可以了,请求 ts 文件时云端直接返回,或者按需转码分片后返回。

    这里再请教下: 转码的场景下,ts 文件的内容,后续是否也需要走 cdn ?
    albin504
        41
    albin504  
    OP
       18 小时 9 分钟前
    @chengzhi 谢谢。 我看推荐 ZLMediaKit 的同学比较多,我详细看看
    HADB
        42
    HADB  
       17 小时 56 分钟前
    说实话我感觉有点搞复杂了,不要过度设计,看你项目到底是多大的项目,多少用户量。你就说 B 站吧,也不是上传完立马就能播的……
    albin504
        43
    albin504  
    OP
       17 小时 39 分钟前
    @chengzhi https://github.com/ZLMediaKit/ZLMediaKit/wiki/ZLMediaKit%E5%AE%9E%E7%8E%B0%E6%8C%89%E9%9C%80%E6%8B%89%E6%B5%81
    看了 ZLMediaKit 的文档,感觉他主要定位是直播。

    客户端需要 RTSP ( Real-Time Streaming Protocol )实时流协议来使用。

    但是目前我们客户端用的 HLS 协议播放视频。

    --------
    以下是 AI 回复:

    RTSP 的特点

    RTSP ( Real-Time Streaming Protocol )是一种 实时流协议,主要用于低延迟点播/直播。

    和 HLS 最大区别:

    HLS 是基于 HTTP 文件切片( m3u8 + ts ),播放器拉文件 → 支持快进/拖动。

    RTSP 是持续的流,不是文件,不存在 m3u8/ts 文件。

    RTSP 客户端想要拖动,必须由 服务器端支持 seek 。
    yuanxing008
        44
    yuanxing008  
       17 小时 35 分钟前
    ts 内容肯定要挂 CDN 啊 万一恶意拉流了 你服务器 200M 的带宽都顶不住
    albin504
        45
    albin504  
    OP
       17 小时 19 分钟前
    @HADB 用户量很大,公司战略产品。
    我看了下哈,B 站上传完视频之后,提示审核中,这应该是中国特殊国情决定的,我们是国外市场,没有审核的逻辑。
    之前试过百度云盘,上传后网页中立马就能播放。
    albin504
        46
    albin504  
    OP
       17 小时 19 分钟前
    @albin504 这么说有点装逼。 或者说,公司很重视产品体验吧,咱程序员只能尽量满足需求
    albin504
        47
    albin504  
    OP
       17 小时 18 分钟前
    @yuanxing008 好。大佬
    guiyumin
        48
    guiyumin  
       15 小时 24 分钟前
    2 、实时转码。 用户边播边转,实现几乎零延迟。

    应该有 1-5 秒的延迟
    guiyumin
        49
    guiyumin  
       15 小时 17 分钟前
    实时转码是不是可以打水印或者广告上去
    albin504
        50
    albin504  
    OP
       12 小时 30 分钟前
    @guiyumin 这个可估算的。1 小时的视频用 GPU 转码最快 45s ,10s 的视频( 1 个分片)不到 1s
    albin504
        51
    albin504  
    OP
       12 小时 29 分钟前
    @guiyumin 理论上是,优酷视频右脚上的水印(优酷 logo )估计就是转码时候加上去的吧
    yuanxing008
        52
    yuanxing008  
       12 小时 12 分钟前
    @albin504 自信一点,就是的,当然如果你使用的是阿里 oss 的方案存储视频源的话,本身就有对应的水印服务可以使用,包括 ts 切片以及在线转码,你现在考虑的这套方案是我 17 年那阵子调研的时候用的了,在我现在的技术视角来看的话,当年的这套方案还是有很大的调整和优化空间(成本控制,技术实现复杂度,维护性等等)
    albin504
        53
    albin504  
    OP
       10 小时 44 分钟前
    @yuanxing008 谢谢,遇到大佬了。 你们自己实现了按需分片转码对吧? 我们是多国家提供服务,阿里云支持的区域,目前用的是阿里云的在线实时转码方案。阿里云不支持的区域,在考虑用上面的自研方案
    yuanxing008
        54
    yuanxing008  
       10 小时 21 分钟前
    @albin504 为何会有阿里云不支持的区域呢?播放源上层套了全球 CDN 的,无非就是客户端的部署问题而已,通过 LB 或者 DNS 进行分流到部署在不同地域的集群不就好了吗
    wnpllrzodiac
        55
    wnpllrzodiac  
       9 小时 55 分钟前 via Android
    @albin504 不转码的话,nginx-vod
    albin504
        56
    albin504  
    OP
       8 小时 1 分钟前
    @yuanxing008 政治原因,数据不能出境。如印度用户的数据必须存储在印度服务器
    guiyumin
        57
    guiyumin  
       3 小时 35 分钟前
    @albin504 这个要是能做成了,是很牛逼的
    因为可以实时加不同的水印
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1002 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 20:11 · PVG 04:11 · LAX 13:11 · JFK 16:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.