V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
V2WT
V2EX  ›  问与答

图片流模拟直播的性能优化问题

  •  
  •   V2WT · 2019-05-29 00:24:50 +08:00 · 1619 次点击
    这是一个创建于 2030 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前正在做一个 算法展示页面。 需求是将嵌入式设备采集的图像及跑完之后算法的结果一并输出展示出来。

    现在的做法是,在嵌入式设备上,通过 ZMQ 将原始图像数据 ( 720P 的灰度图)以及当前图像相关的语义信息(目标框,点之类的)通过 protobuf 序列化后 发送到 服务端( flask ), 服务端将 灰度图编码成( jpg )通过 base64 嵌入 json 发送到 前端。

    前端每一帧都用 canvas 绘制到界面上。

    目前前端如果是一台非常好的机器的时候 可以保持流畅, 可是换成普通的笔记本电脑 就会越来越慢,延时逐渐增加。

    还有一个问题是如果多个浏览器同时登陆服务器预览的话,有一个浏览器慢的话会拖累所有的浏览器。

    这个流程有什么技术层面上还能优化的吗? 还有我这样的需求 有没有其他的实现方式? 也考虑过将图片推流到流媒体服务器,前端进行拉流展示,但是就不好做到语义信息及视频帧的同步。

    有哪位做过类似的 可以指导下吗?

    12 条回复    2019-06-01 16:35:44 +08:00
    yinanc
        1
    yinanc  
       2019-05-29 00:29:30 +08:00
    这…… 720P 图像编码到 base64 再传输再解码还用 canvas 一帧帧绘制,每个过程想想都是消耗极大的吧
    直接用视频推流不好吗?
    V2WT
        2
    V2WT  
    OP
       2019-05-29 01:03:57 +08:00
    @yinanc 直接推流 就是不好做同步,因为我每一帧都想要绘制目标框体之类的数据,想用前端 丰富的展示手法去显示 比如 Three.js 之类的。
    还有想请问下 前端 base64 解码开销大吗?
    chinuno
        3
    chinuno  
       2019-05-29 08:04:05 +08:00 via Android
    做 base64 开销巨大。如果一定要传图片这种方式的话可以考虑用 websocket 传数据,去掉 base64。你这个延时增加有可能是因为网络 io 跟反序列化耗时长。按照 25fps 的视频一张图片处理的时间不超过 40ms,具体测看看是哪部分耗时长再做针对性优化
    jswh
        4
    jswh  
       2019-05-29 09:33:11 +08:00
    websocket 直传二进制数据会不会好点。
    0987363
        5
    0987363  
       2019-05-29 09:50:19 +08:00 via Android
    server 端统一用 ws 推送,加超时处理
    V2WT
        6
    V2WT  
    OP
       2019-05-29 11:17:06 +08:00
    @chinuno 有这个想法,所以想问下如果我用 websocket 直接传递二进制数据,如何将语义信息及图片二进制一起编码( python ) 和解码( javascript )呢?
    V2WT
        7
    V2WT  
    OP
       2019-05-29 12:57:50 +08:00
    @0987363 现在服务端用的是一个 python-websocket 的框架, 对所有连接上来的前端 轮训着去发送,但是不知道在哪里做超时的设置,请问下有熟悉的 websocket server 框架推荐吗? 我试过几个 总是感觉发送慢,可是实际上网络并没有占满。
    V2WT
        8
    V2WT  
    OP
       2019-05-30 02:50:01 +08:00
    顶一下,今天还没能解决这个问题。。
    V2WT
        9
    V2WT  
    OP
       2019-05-30 12:54:12 +08:00
    再来看看,目前想把 base64 先剔除掉看看
    0987363
        10
    0987363  
       2019-05-30 20:57:32 +08:00 via Android
    @V2WT 这个没用过,如果你是单线程轮询,那么就改多线程试试
    V2WT
        11
    V2WT  
    OP
       2019-05-31 21:46:03 +08:00
    暂时将 Base64 操作剔除了,直接将 protobuf 发送到前端,由前端去解析,效果好了非常多。
    V2WT
        12
    V2WT  
    OP
       2019-06-01 16:35:44 +08:00
    问题解决了。。前端的同事 每次来一帧画面都 new 了一个 新的 canvas..
    只用一个 canvas 就行了。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3028 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 14:02 · PVG 22:02 · LAX 06:02 · JFK 09:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.