V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ZoomQuiet
V2EX  ›  Lua

如何构建伪视频流服务? 低延时低采样, 基于 OpenResty , HTTP, 内网...

  •  
  •   ZoomQuiet · 2019-01-31 10:16:01 +08:00 · 7080 次点击
    这是一个创建于 2160 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景

    出于各种业务 /硬件 /软件博弈, 最终不得不面对...

    • 局网中一台 Linux mini 主机
    • 接入多路 web cam.
    • 由 FFmpeg 采集视频为帧图片编号输出到硬盘
      • -f image2 frames/%05d.jpg
      • 类似参数控制输出
    • 另外主机用 Electron 开发控制客户端
    • 需要拿到实时图像, 以便形成监察视频, 要求尽可能延时小
      • 页面刷新 15fps 以上即可
      • 但是, 从 Linux 到控制端, 延时得尽可能小

    分析

    • 从硬件到展示延时尽可能小
      • 就不能走标准流媒体协议了
      • 无论什么协议都得先视频->流化->广播->接收->解码(专用)->展示
      • 特别是有的适用许可证约束只能走外网免费服务, 延时随便就超过 10 秒...
    • 注意到有很多视频广播技术其实是 伪视频:
      • 服务端持续更新约定图片
      • 客户端反复通过 HTTP 拿到包含新内容图片
      • 在 HMTL 页面反复加载
      • 形成原始意义实时电影
    • 问题在:
      • FFmpeg 是按序列号约定自动变化图片名输出到指定目录
      • 远程 JS 想拿到最新一帧图片
      • 首先要知道最新图片名, 才能发起请求

    设想

    功能服务

    • 用 Python 可以快速完成一个 API 服务
    • 提供接口, 比如: /frame/last 反馈最新一帧图片名
    • 然后从 Nginx 发布静态目录下载
    • 但是, 这样消耗两次 HTTP 请求时间

    ngx_lua 应用

    • 用 OpenResty 加载一 lua 功能脚本
    • 提供接口, 比如: /frame/last 反馈最新一帧图片内容
    • 将两次请求变成一次
    • 但是, 这要求 lua 进行实时同步文件操作
      • 不知是否合理
      • 以及具体系统损耗如何

    讨论

    或是有其它更加优雅方案?

    感谢大家任何建议.

    6 条回复    2019-05-22 15:33:56 +08:00
    jessynt
        1
    jessynt  
       2019-01-31 10:24:18 +08:00
    使用 websocket 分发流,Canvas 绘制呢?
    chinvo
        2
    chinvo  
       2019-01-31 10:25:51 +08:00 via iPhone
    WebRTC
    guanhui07
        3
    guanhui07  
       2019-01-31 10:32:13 +08:00
    我也想研究下使用分发流,Canvas 绘制
    ZoomQuiet
        4
    ZoomQuiet  
    OP
       2019-01-31 10:40:31 +08:00 via iPhone
    @jessynt 是也乎 ╮(╯▽╰)╭

    感谢建议…这个方向也查过…

    但是这将无法形成帧图片数据集了…

    因为…业务要求是异步图形分析~
    并不是远程监控…

    可以说…远程监控是次要功能…
    数据记录是核心需求…

    硬件釆样率超过 120Hz …
    但~监控 15fps 就好…
    cs8425
        5
    cs8425  
       2019-04-02 12:52:42 +08:00
    @ZoomQuiet #4
    来晚了....
    不过 @jessynt #1 的方法是可行的
    很久之前就做过好几个类似的
    整理一下放出来给你参考: https://github.com/cs8425/ffmpeg-ws-relay
    透过 websocket 连续传送单个 jpg 或是 png 格式的 frame
    只要在里面加一段把每个 frame 写到档案去的程式
    要降 fps 也只要修改一下几个 frame 再广播一个即可
    ZoomQuiet
        6
    ZoomQuiet  
    OP
       2019-05-22 15:33:56 +08:00
    @cs8425 是也乎,( ̄▽ ̄)

    俺也来晩了... mark them,
    这就去实验
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1099 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 18:54 · PVG 02:54 · LAX 10:54 · JFK 13:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.