Wasm 无服务端音视频转码工具 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
suke119
V2EX    分享创造

Wasm 无服务端音视频转码工具

  •  
  •   suke119
    wangsrGit119 2023-01-14 14:18:16 +08:00 4733 次点击
    这是一个创建于 1067 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在折腾音视频相关的,本来想搞个网页工具在线转码,视频转 Gif ,音频提取的工具,原本是打算后端处理,然后返回处理结果给前端的,但是想到这玩意涉及的文件如果敏感再加上宽带遭不住,所以就直接玩玩 Wasm这玩意,只能说很牛,这两天写了个在线演示 Demo:

    https://lav.wangsrbus.cn

    宽带较小,因为首次加载 Wasm 文件的时候比较慢,等加载完成就可以录屏,录像,转码(转 avi ,当然后面可以自定义),录屏转 GIF 。 主要用到的还是ffmpeg编译好的Wasm文件,处理起来很方便,如果了解一些基本ffmpeg命令的话基本上都是实现。

    未来,因为ffmpeg的命令基本都支持,那么理论上客户端推流拉流基本上都可以实现,因为后期可以扩展。自己也是WebRTC的重度爱好者,想把这玩意和Wasm结合,从 RTC 到 RTE 过渡,我感觉Wasm在未来一定很有大的飞跃。

    如果想要完整代码的话,我在掘金也发了文章,感兴趣的可以自己看看,实现细节文章和源码

    第 1 条附言    2023-01-14 17:23:43 +08:00

    大家体验的时候可以F12,打开控制台实时打印的参数,如果出现下面的则说明初始化完成(注意 ffmpeg loaded,第一次加载较慢)。

    [info] use ffmpeg.wasm v0.11.6 createFFmpeg.js:43 [info] load ffmpeg-core createFFmpeg.js:43 [info] loading ffmpeg-core createFFmpeg.js:43 [info] ffmpeg-core loaded WasmFfmpeg.vue:157 ffmpeg loaded 

    其他转码,转GIF的过程日志都可以看到

    37 条回复    2023-01-19 14:01:45 +08:00
    suke119
        1
    suke119  
    OP
       2023-01-14 14:58:23 +08:00   1
    呀 没人感兴趣吗 呜呜呜
    Rrrrrr
        2
    Rrrrrr  
       2023-01-14 15:44:01 +08:00
    之前玩了一个 demo ,转个几 M 的东西,都要好久
    sue119
        3
    suke119  
    OP
       2023-01-14 16:05:21 +08:00
    @Rrrrrr 和本地 CPU 性能挂钩的,还有转码参数设置,未来感觉更多的编译库出来会越来越好玩。
    suke119
        4
    suke119  
    OP
       2023-01-14 16:08:58 +08:00
    @Rrrrrr 谷歌的 MediaPipe (人脸分割,行为分析、手势识别、动作识别、物体识别)媒体图像处理的就是用 wasm 的,然后配合 WebGL 实现 GPU 的调度。
    klo424
        5
    klo424  
       2023-01-14 16:10:07 +08:00
    更感兴趣低延迟的 web 端拉视频流
    suke119
        6
    suke119  
    OP
       2023-01-14 16:12:06 +08:00
    @klo424 那必然是 WebRTC 拉流了,现在很多的,ZLM 、SRS 等开源的;如果感兴趣的话可以看看我写的掘金小册,我主页有的
    okakuyang
        7
    okakuyang  
       2023-01-14 16:13:49 +08:00
    我目前需求迫切的:
    jpg 转 avif
    jpg 转 webp ( chrome 支持,但是其他浏览器不支持)

    avif 真的很诱惑,但是现有的方案速度都不够理想。
    suke119
        8
    suke119  
    OP
       2023-01-14 16:19:40 +08:00
    @okakuyang 这个确实是,但是 wasm 毕竟还没长大,成型的 wasm 编译库很少,FFmpeg 原生转换的话都需要重新编译依赖,wasm 我估计也不得行
    KMpAn8Obw1QhPoEP
        9
    KMpAn8Obw1QhPoEP  
       2023-01-14 16:21:54 +08:00 via Android
    @okakuyang 本地 node 跑个 sharp 就行了 一行代码的事
    suke119
        10
    suke119  
    OP
       2023-01-14 16:24:16 +08:00
    @okakuyang 看下这个 https://www.npmjs.com/package/libavif-wasm 现成的 wasm 库,还没试效果
    suke119
        11
    suke119  
    OP
       2023-01-14 16:25:05 +08:00
    @enchilada2020 服务端处理的方式很多的,但是纯 web 端处理,wasm 更有优势一些撒
    tf2
        12
    tf2  
       2023-01-14 16:28:48 +08:00
    吧 ffmpeg 的 wasm 精简一下。 不必要的功能去掉。
    suke119
        13
    suke119  
    OP
       2023-01-14 16:37:41 +08:00
    @lambdaq 后面发展壮大了 会出来很多这个库的,期待中(`)
    justin2018
        14
    justin2018  
       2023-01-14 18:30:53 +08:00
    这个库 得加载一段时间 库有点大
    suke119
        15
    suke119  
    OP
       2023-01-14 18:55:00 +08:00
    @justin2018 是的 好在加载一次之后磁盘缓存了,刷新后都是从 disk cache 里加载的
    xiangyuecn
        16
    xiangyuecn  
       2023-01-14 19:00:59 +08:00
    转码兴趣不大,用 js 生成视频比较感兴趣,前段时间还找了好几个库 生成 webm 或 mp4 的,不过都不能添加音轨 没啥多大用处,只能生成无声视频,配合 canvas 画图 还是很的
    suke119
        17
    suke119  
    OP
       2023-01-14 19:31:28 +08:00 via iPhone
    @xiangyuecn ffmpeg.wasm 不就是干这个的撒 原生命令都支持的 视频编辑
    Actrace
        18
    Actrace  
       2023-01-14 20:57:07 +08:00
    之前有设计过这一块的业务,怎么说呢,如果客户不介意的话,挺好的。
    不过现实是 B 站之前好像玩过一次,被骂的很惨。

    另外 WASM 不能调用 GPU 硬解是个硬伤,效率上还是有待优化。
    xuanyuanaosheng
        19
    xuanyuanaosheng  
       2023-01-14 21:05:26 +08:00
    支持一波!
    xiangyuecn
        20
    xiangyuecn  
       2023-01-14 21:09:21 +08:00
    @suke119 #17 也行哈,就是 ffmpeg.wasm 太大了,得想办法去掉没有用到的功能
    suke119
        21
    suke119  
    OP
       2023-01-14 21:24:07 +08:00 via iPhone
    suke119
        22
    suke119  
    OP
       2023-01-14 21:25:42 +08:00 via iPhone
    @Actrace 配合 webgl 可以 谷歌那个 mediapiple 就是的 不清楚具体怎么弄的
    humbass
        23
    humbass  
       2023-01-14 23:02:48 +08:00
    @suke119 刚好也在搞这小玩意。 发现 assembly 的版本没法推拉流,只能处理文件。

    楼主留个联系,或者+我 wx: ZGFsaS1jaGVu
    Aloento
        24
    Aloento  
       2023-01-15 01:25:46 +08:00
    suke119
        25
    suke119  
    OP
       2023-01-15 11:08:26 +08:00
    @Aloento 这个包我也看了下 对于 MEMFS 中文件的管理不太灵活,对 FS 的 API 对接没得 ffmpeg.wasm 灵活
    suke119
        26
    suke119  
    OP
       2023-01-15 11:47:00 +08:00
    @humbass ffmpeg.wasm 对的 推流暂时还不支持,作者也在探索,感兴趣的话看看这个 https://github.com/davedoesdev/streamana
    ByteCat
        27
    ByteCat  
       2023-01-15 14:16:31 +08:00
    ffmpeg.wasm 比原生性能还是差得多,不过可以用来实现一些 js 做不到的事情,还是挺有趣的,我去年就用过这个包。
    suke119
        28
    suke119  
    OP
       2023-01-15 14:26:39 +08:00
    @ByteCat 是的 ,期待后面这个的发展
    littlewing
        29
    littlewing  
       2023-01-15 14:38:11 +08:00
    这个性能和在本地用原生 ffmpeg 的性能相比有差别吗
    suke119
        30
    suke119  
    OP
       2023-01-15 14:56:35 +08:00
    @littlewing 和本地肯定有差别的,但是比纯 JS 处理同等的事要强的多,官方描述是和接近本地的速度,所以优化的好的话可以接近,但是完美的和本地媲美是不行的
    Aloento
        31
    Aloento  
       2023-01-15 19:08:48 +08:00 via iPhone
    @suke119 ffmpeg.wasm 最大的问题是共享内存,浏览器一般不会启用这个功能的,非常头疼而且贼大
    suke119
        32
    suke119  
    OP
       2023-01-15 19:37:31 +08:00
    @Aloento wasm 公用的 MEMFS 。ffmpeg.wasm 对接的 FS 的基本 API ,按照实际情况判断下啥时候启用,然后用完删除即可,很灵活,就担心不删除然后浏览器直接崩了
    shenhuilin0
        33
    shenhuilin0  
       2023-01-17 10:12:30 +08:00 via Android
    那以后前端是不是能自己播放 rtsp 流了
    suke119
        34
    suke119  
    OP
       2023-01-17 10:29:43 +08:00
    @shenhuilin0 对的 我也在探索这个 毕竟按照以往的方式 要么直接 websocket 要么 自己搭建流媒体服务端 ,如果后期真的出来 wasm 的 websocket 库+ffmpeg-stream 的 我觉得可行性非常高
    duke807
        35
    duke807  
       2023-01-18 23:03:06 +08:00
    @suke119

    OP 您提一个建议:

    目前比较火的最新的视频编码 AV1 只有 ios 不支持,建议您写一个 polyfill ,可以简单的让 ios 浏览器支持 av1 编码的 webm 视频播放(配套音频编码是 opus )

    AV1 视频关键帧是 AVIF 图片编码格式,目前已经全平台支持,ios 是最后支持的,ios 支持之前,网上有 polyfill 让 ios 支持 AVIF 图片: https://github.com/Kagami/avif.js

    ios 之所以支持 AVIF 其中也应该有该 polyfill 的功劳

    楼主若实现我说的 av1 视频的 polyfill ,做到易用,用户加一行 <script src="xxx"> 就可以,非 ios 系统不加载 wasm 等大文件,一定能名声大噪
    (性能不够可以转小一点分辨率、小一点帧率,或者加一个转码进度条呈现给用户)
    suke119
        36
    suke119  
    OP
       2023-01-19 14:01:04 +08:00 via iPhone
    @duke807 主要是转码这个需要刻意的等待,如果非主观医院转码,在不同的用户体验中 估计马上秒退,就算是低帧率低分辨率,如果遇到视频长一点的,在提示转码的时候说不定就离开网页了。
    suke119
        37
    suke119  
    OP
       2023-01-19 14:01:45 +08:00 via iPhone
    @duke807 打错字了 主观意愿
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1175 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 38ms UTC 17:37 PVG 01:37 LAX 09:37 JFK 12:37
    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