将 ComfyUI 生成的视频帧通过高速网络传输到远程 GPU 服务器进行硬件编码
- 极致性能 - 9-11 Gbps 带宽,5-10ms 延迟,零拷贝传输
- 硬件加速 - NVIDIA NVENC H.264/HEVC/AV1 编码
- 智能管理 - 自动网络检测、连接复用、进度追踪
- 三种协议 - Arrow Flight(推荐)、ZMQ 优化版、ZMQ 原版
- 单文件部署 - 编码服务器无需额外依赖,开箱即用
┌──────────────────────────┐ ┌──────────────────┐ ┌─────────────────────────┐
│ ComfyUI Client │ │ 10Gbps Network │ │ Remote GPU Server │
│ │ │ │ │ │
│ ┌────────────────────┐ │────────▶│ Arrow Flight │────────▶│ ┌──────────────────┐ │
│ │ Image Generation │ │ │ Zero-copy │ │ │ NVIDIA NVENC │ │
│ └────────┬───────────┘ │ │ │ │ └────────┬─────────┘ │
│ │ │ │ │ │ │ │
│ ┌────────▼───────────┐ │ │ │ │ ┌────────▼─────────┐ │
│ │ Node Module │ │ │ │ │ │ FFmpeg Muxer │ │
│ └────────────────────┘ │ │ │ │ └────────┬─────────┘ │
│ │ │ │ │ │ │
└──────────────────────────┘ └──────────────────┘ │ ┌────────▼─────────┐ │
│ │ MP4 Output │ │
│ └──────────────────┘ │
└─────────────────────────┘
设计思路:
- 关注点分离 - ComfyUI 负责生成,编码服务器负责编码,通过网络连接
- 零拷贝传输 - 使用 Arrow Flight 或 ZMQ 优化,避免不必要的数据拷贝
- 批量优化 - 高帧率场景下自动批量传输,减少系统调用
- 连接复用 - 多次传输复用同一连接,减少握手开销
- 会话管理 - 支持单批次和多批次,灵活适配不同工作流
| 特性 | Arrow Flight v3.0 | ZMQ 优化版 v2.1 | ZMQ 原版 v2.0 |
|---|---|---|---|
| 推荐度 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ |
| 带宽 | 9-11 Gbps | 9-11 Gbps | 7-9 Gbps |
| 延迟 | 5-10ms | 5-10ms | 5-15ms |
| 零拷贝 | 完全 | 优化 | 部分 |
| 协议开销 | 0 字节 | 0 字节(批量) | 128 字节/帧 |
| 传输模式 | 批量 | 流式/批量/自动 | 批量 |
| 进度条 | tqdm | tqdm | 自定义 |
| 日志 | 结构化 | 结构化 | 自定义 |
推荐:Arrow Flight v3.0 - 最新、最快、最稳定的协议
# 1. 安装依赖
pip install pyarrow tqdm
# 2. 启动 GPU 编码服务器
python gpu_encoder_arrow.py --bind 0.0.0.0:8815
# 3. 在 ComfyUI 中使用
# 添加 "Remote GPU Encoder (Arrow Flight)" 节点即可# 1. 安装依赖
pip install pyzmq tqdm
# 2. 启动 GPU 编码服务器
python gpu_encoder.py --bind tcp://0.0.0.0:5555
# 3. 修改 __init__.py 切换到 ZMQ 优化版
# from .nodes_zmq_optimized import NODE_CLASS_MAPPINGS, NODE_DISPLAY_NAME_MAPPINGS
# 4. 在 ComfyUI 中使用 "Remote GPU Encoder (ZMQ Optimized)" 节点修改 __init__.py:
# Arrow Flight (默认)
from .nodes_arrow import NODE_CLASS_MAPPINGS, NODE_DISPLAY_NAME_MAPPINGS
# ZMQ 优化版
from .nodes_zmq_optimized import NODE_CLASS_MAPPINGS, NODE_EDITOR_DISPLAY_MAPPINGS
# ZMQ 原版
from .nodes import NODE_CLASS_MAPPINGS, NODE_DISPLAY_NAME_MAPPINGS生成视频 ─▶ 远程编码 ─▶ 完成
使用默认的 auto 会话模式,节点自动管理会话开始和结束。
批次 1 ──▶ 远程编码 ──┐
批次 2 ──▶ 远程编码 ──┤─▶ 合并输出
批次 3 ──▶ 远程编码 ──┘
使用 start/continue/end 模式手动控制会话。
使用 Arrow Flight + 批量传输模式,适合高帧率、长视频。
| 参数 | 说明 | 默认值 |
|---|---|---|
images |
视频帧 (BHWC) | 必填 |
encoder_address |
服务器地址 | 0.0.0.0:8815 |
output_path |
输出路径 | /tmp/output.mp4 |
fps |
帧率 | 30 |
audio |
音频 | 可选 |
batch_size |
批量大小 | 10 |
| 参数 | 说明 | 默认值 |
|---|---|---|
images |
视频帧 (BHWC) | 必填 |
encoder_address |
服务器地址 | tcp://10.10.0.1:5555 |
output_path |
输出路径 | /tmp/output.mp4 |
fps |
帧率 | 30 |
transport_mode |
传输模式 | auto |
batch_size |
批量大小 | 10 |
传输模式 (ZMQ):
auto- 智能选择(<50 帧用 stream,>=50 帧用 batch)stream- 流式传输,最低延迟batch- 批量传输,最高吞吐
# Arrow Flight 服务器
python gpu_encoder_arrow.py [OPTIONS]
# ZMQ 服务器
python gpu_encoder.py [OPTIONS]通用选项:
--bind, -b- 绑定地址(Arrow 默认0.0.0.0:8815,ZMQ 默认tcp://0.0.0.0:5555)--output-dir, -o- 输出目录--codec, -c- 编码器(h264_nvenc / hevc_nvenc / av1_nvenc)--preset, -p- 预设(p1-p7,p1 最快,p7 质量最好)--bitrate- 码率(默认 20M)--gpu- GPU 索引(默认 0)--single-session- 单会话后退出--idle-timeout- 空闲超时(秒)
# 4K 视频,高码率
python gpu_encoder_arrow.py --bind 0.0.0.0:8815 --codec av1_nvenc --bitrate 50M --preset p4
# 高帧率(60fps),快速编码
python gpu_encoder_arrow.py --bind 0.0.0.0:8815 --preset p2基于 RGB uint8 tensor 原始数据(未压缩)
原始视频帧的计算:
- 720p = 1280x720 像素
- 1080p = 1920x1080 像素
- 4K = 3840x2160 像素 假设是 RGB(3通道)或 RGBA(4通道),每个通道 8位(1字节)或 16位(2字节)或 32位浮点(4字节)。 常见的 tensor 格式:
- uint8 (0-255) - 每个像素 1 字节
- uint16 - 每个像素 2 字节
- float32 - 每个像素 4 字节 RGB uint8:
- 720p: 1280 * 720 * 3 = 2,764,800 字节 ≈ 2.63 MB
- 1080p: 1920 * 1080 * 3 = 6,220,800 字节 ≈ 5.93 MB
- 4K: 3840 * 2160 * 3 = 24,883,200 字节 ≈ 23.73 MB RGB uint16:
- 720p: 1280 * 720 * 3 * 2 = 5,529,600 字节 ≈ 5.27 MB
- 1080p: 1920 * 1080 * 3 * 2 = 12,441,600 字节 ≈ 11.86 MB
- 4K: 3840 * 2160 * 3 * 2 = 49,766,400 字节 ≈ 47.48 MB RGB float32:
- 720p: 1280 * 720 * 3 * 4 = 11,059,200 字节 ≈ 10.55 MB
- 1080p: 1920 * 1080 * 3 * 4 = 24,883,200 字节 ≈ 23.73 MB
- 4K: 3840 * 2160 * 3 * 4 = 99,532,800 字节 ≈ 94.96 MB
| 分辨率 | 帧大小 (3通道) | 30fps 带宽 | 60fps 带宽 |
|---|---|---|---|
| 720p | 2.6 MB | 630 Mbps | 1.26 Gbps |
| 1080p | 5.9 MB | 1.42 Gbps | 2.85 Gbps |
| 4K | 23.7 MB | 5.70 Gbps | 11.40 Gbps |
| 协议 | 720p@30fps | 1080p@30fps | 4K@30fps |
|---|---|---|---|
| Arrow Flight | 1.2x | 1.3x | 1.4x |
| ZMQ 优化版 | 1.2x | 1.3x | 1.4x |
| ZMQ 原版 | 1.0x | 1.0x | 1.0x |
相对于 ZMQ 原版的性能提升倍数
sudo sysctl -w net.core.rmem_max=268435456
sudo sysctl -w net.core.wmem_max=268435456
sudo sysctl -w net.ipv4.tcp_rmem="4096 87380 67108864"
sudo sysctl -w net.ipv4.tcp_wmem="4096 87380 67108864"- 带宽: 建议 10Gbps 或更高(4K@60fps 需要 11.4 Gbps)
- 延迟: 建议 <5ms(局域网)
- 稳定性: 丢包率 <0.1%
comfyui-remote-encoding/
├── __init__.py # 包入口(默认 Arrow Flight)
├── nodes_arrow.py # Arrow Flight 节点 ⭐
├── nodes_zmq_optimized.py # ZMQ 优化版节点
├── nodes.py # ZMQ 原版节点
├── gpu_encoder_arrow.py # Arrow Flight 服务器(单文件)⭐
├── gpu_encoder.py # ZMQ 服务器
├── protocol/ # ZMQ 协议定义
│ ├── __init__.py
│ └── protocol.py
├── transport/ # Arrow Flight 传输模块
│ ├── __init__.py
│ ├── client.py
│ └── protocol.py
├── logger/ # 日志系统
│ ├── __init__.py
│ └── logger.py
├── utils/ # 工具模块
│ ├── __init__.py
│ ├── audio.py
│ ├── connection.py
│ ├── network.py
│ └── storage.py
├── README.md
└── requirements.txt
核心模块:
transport/- Arrow Flight 传输层(零拷贝、批量优化)protocol/- ZMQ 协议定义(消息类型、格式)logger/- 专业日志系统(彩色、结构化、进度条)utils/- 工具类(网络、连接、音频)
Arrow Flight - 追求最高性能、新项目 ZMQ 优化版 - 现有项目升级、需要快速迁移 ZMQ 原版 - 快速测试、学习项目
- 检查服务器是否启动
- 检查网络连通性
- 检查防火墙设置
- 查看服务器日志
- 使用 Arrow Flight 或 ZMQ 优化版
- 启用批量传输模式
- 调整批量大小和窗口
- 优化网络缓冲区
- 使用 10Gbps 网络
- H.264 (h264_nvenc)
- HEVC (hevc_nvenc)
- AV1 (av1_nvenc)
需要支持 NVENC 的 NVIDIA GPU。
MIT License
有问题? - 提交 Issue 或 Pull Request
喜欢这个项目? - 给个 Star ⭐