程序员菜鸟,请教一个 web 视频转码的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
Asuler
V2EX    程序员

程序员菜鸟,请教一个 web 视频转码的问题

  •  1
     
  •   Asuler 2024-09-05 22:13:19 +08:00 2942 次点击
    这是一个创建于 407 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我们公司在某地硬件设备上装了视频监控,目前是上传到云存储桶里,为了节省存储带宽等成本,存的是 h.265 编码格式的视频,但是这样子在浏览器端没法播放

    所以我想了两个方案
    1. 浏览器端找能支持 h265 的播放器 js ,但是基本上找到的都是基于 wasm 的 ffmpeg ,也就是在浏览器端解码,然后通过 canvas 一帧一帧画,然后再用 audio 播放声音。感觉这个方案不是很好,可能会又吃性能又卡,还有可能声音画面不同步。

    2.通过增加中间层服务,使用 ffmpeg+nodejs 进行转码(我不太会其他语言)。尝试了一下如果用 ffmpeg 完全把一个视频转换成 h264 的格式,耗费的时间会很长,有些长视频要半个多小时。

    所以我现在的想法是:

    我看浏览器的 video 标签加载视频时,也不是整个视频缓冲完才开始播放呀,metadata 加载到了就可以播放了?而且貌似也是播放一点加载一点,这样是不是可以用 ffmpeg+nodejs 做成实时转码的服务?浏览器端请求一小段,就转一小段,这样子就使得该视频原生支持 video 标签了,也不需要额外的播放器 js 了。同时也能使用 video 标签自带的进度条拖拽进度

    想问下大家我的这个想法是否可行?

    还有个问题,我看到一些方案里写 ffmpeg 转 m3u8 ,然后存一堆 ts 文件,浏览器端再用某个 js 播放库去播放,这样存储成本是不是又上来了?外加转码服务的服务器成本,搞不好还不如一开始直接存 h264 格式?

    ffmpeg+nodejs 有没有可能做到实时转码成原生 video 支持的格式,对于浏览器端来说属于无感知的转码那种的,不需要存文件,直接返回流给前端
    21 条回复    2024-09-07 11:05:12 +08:00
    zhmouV2
        1
    zhmouV2  
       2024-09-05 22:20:09 +08:00
    第一个性能确实挺烂的,俺任职的某个小公司似乎有个平台也是这么实现的(斜眼笑
    但是 chrome 现在不是可以 h265 硬解吗?具体我也不是很懂
    beyondsoft
        2
    beyondsoft  
       2024-09-05 22:24:51 +08:00
    你这样性能太低了, 如果同时有多个人怎么解决. 我给你推荐一个方案 用一个中间服务, 中间服务自己把 视频流录制好, 页面里面直接引用就好. 在这里强烈推荐
    https://github.com/bluenviron/mediamtx 这个项目, 部署一下然后把监控的流推到这里, 页面直接用就行了
    rabbbit
        3
    rabbbit  
       2024-09-05 22:33:09 +08:00
    给一个实现方式参考,挺邪门的。
    海康的 web sdk 自带支持查看录像机的 h265 回放(需要本地安装 exe 软件)。
    猜测原理是 exe 开个服务,本地解码 h265 ,绘制一个窗口盖在浏览器上。
    v1
        4
    v1  
       2024-09-05 22:40:41 +08:00
    sagaxu
        5
    sagaxu  
       2024-09-05 22:42:54 +08:00
    建议好好研究研究几个 porn 视频网站,看看业界是怎么存储和播放的
    z0ffy
        6
    z0ffy  
       2024-09-05 22:45:20 +08:00
    chrome105 之后支持硬解。应该可以支持大部分 h265 。再用 electron 搞个播放端,解决。剩余播放不了的,丢过去转码。
    ysc3839
        7
    ysc3839  
       2024-09-05 23:12:23 +08:00 via Android
    实时转码一般也会存入硬盘的,不然内存消耗很大
    xiaohang427
        8
    xiaohang427  
       2024-09-05 23:20:29 +08:00 via iPhone
    @sagaxu 思路刁钻
    Projection
        9
    Projection  
       2024-09-05 23:30:33 +08:00
    https://chromium.woolyss.com/ 有包含 H.265 解码器的 Chromium 下载
    为哈非得在浏览器播放,本地随便起个播放器不行吗
    lingo
        10
    lingo  
       2024-09-05 23:38:33 +08:00
    我们之前是直播流,rtsp 还是 rtmp 什么的细节忘了。。内部用的,大佬直接改了 chromium 的源码(笑哭
    billlee
        11
    billlee  
       2024-09-06 02:26:52 +08:00
    看看 b 站是怎么做的,他们可以 wasm 软解 av1
    geekvcn
        12
    geekvcn  
       2024-09-06 02:51:53 +08:00
    你用的啥野鸡浏览器? Edge ? Edge 去商店装个 HEVC 扩展,Chrome 的话字节跳动早就提交代码支持 HEVC 解码了 107 之后的版本
    qqqnnn
        13
    qqqnnn  
       2024-09-06 08:07:20 +08:00
    h265 本身电脑都支持硬解 看看是否装了 hevc 可以看看常用的 web 播放器 flv-h264js xgplay jessibuca
    jifengg
        14
    jifengg  
       2024-09-06 09:39:00 +08:00
    前段时间一个项目参考过 https://github.com/648540858/wvp-GB28181-pro
    这个项目,他支持页面播放 h265 的,可以自己研究一下。
    rain0002009
        15
    rain0002009  
       2024-09-06 10:00:19 +08:00
    既然都云存储了 为啥不用云存储提供的服务 不管是阿里云,百度云啥的一般都提供音视频转码和视频播放 sdk 就是要钱
    heimoshuiyu
        16
    heimoshuiyu  
       2024-09-06 10:24:36 +08:00
    > ffmpeg+nodejs 有没有可能做到实时转码成原生 video 支持的格式,对于浏览器端来说属于无感知的转码那种的,不需要存文件,直接返回流给前端

    可以,我在自己的项目里 https://github.com/heimoshuiyu/msw-open-music 就这么做的,后端调用 ffmpeg 数据输出到标准输出流,然后直接发送到浏览器。我还注意到其他项目也是这样实现的实时转码
    - https://github.com/jellyfin/jellyfin
    - https://github.com/sentriz/gonic

    不过这么做不支持 seek 播放,需要后端根据客户端请求播放的视频时间点,修改 ffmpeg 的 -ss 参数
    rb6221
        17
    rb6221  
       2024-09-06 14:31:33 +08:00
    不用搞这么复杂,很简单,首先回放做本地磁盘缓存+云端同步,近期的就直接从本地磁盘播,要看很久以前的回放,再去拉云端资源,这个情况占比较少,所以带宽方面并不占太多,云端储存的话本身就便宜,而且冷数据会更便宜。
    中间件实时转码的话,首先你这个中间件配置不能太低,如果有多个用户同时看不同的视频,那你的机器同时实时解码多个流,性能能否吃的住?并且也一样占用带宽,我不知道从数据服务器接收数据算不算带宽,如果算的话,接收数据+转码以后回传到你的播放端,算是两倍带宽成本了。
    nevermoreluo
        18
    nevermoreluo  
       2024-09-06 15:07:39 +08:00
    你要问可行不可行,只要时间够,应该都是可行的
    不过我还是建议,试试找找监控厂家是不是有现成方案

    或者试试一些 github 是现成的流媒体服务器,看看能不能客户端实现对应 api 做拉流就行了,省的自己写一大堆坑。流媒体水太深了,video 标签不支持的格式,为什么不支持拉出来可以研究一下午。
    AV1
        19
    AV1  
       2024-09-06 15:12:53 +08:00
    能不能说下视频编码的具体参数?按道理现在的 chrome 都能正常直接播放 h265/hevc 了。
    twosix
        20
    twosix  
       2024-09-06 16:07:04 +08:00
    kele1997
        21
    kele1997  
       2024-09-07 11:05:12 +08:00
    感觉还是可以考虑用 m3u8 视频格式的,转码服务可以使用 mediaserver 或者 srs,他们都支持按需拉流,需要视频流的时候才进行转换
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2836 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 08:27 PVG 16:27 LAX 01:27 JFK 04:27
    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