You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FFmpeg直播视频实时坐标标记:zmq单滤镜替代sendcmd可行性问询

Absolutely, you can replace sendcmd with ZMQ to update your drawtext coordinates in real-time—no filter complex required. Let’s break down why your original setup failed, and walk through the ZMQ-based solution step by step.

Why Your sendcmd Setup Stopped Working

The core issue here is how sendcmd works: it reads the entire cmd.txt file once when the filter initializes, and never checks for subsequent changes to the file. That’s why your marker only moved during the initial 1.5s compensation window—FFmpeg never picked up the new coordinates you wrote to the file later. ZMQ was designed specifically for this kind of real-time command injection, so it’s a perfect replacement.

Implementing ZMQ + drawtext (Single Filter Chain)

You can directly chain the zmq filter with drawtext in your -vf argument, no complex filter graphs needed. Here’s how to set it up:

1. Updated FFmpeg Command

The zmq filter binds a TCP socket (default: tcp://localhost:5555) to listen for real-time commands, which it passes directly to the following drawtext filter:

ffmpeg -fflags nobuffer -vaapi_device /dev/dri/renderD128 -f v4l2 -i /dev/video0 -vf "zmq,drawtext=fontfile=font.ttf:fontsize=30:fontcolor=white:r=25:text='o',format=nv12,hwupload" -copyts -c:v h264_vaapi -qp 24 -y 0.mp4

2. Python ZMQ Client to Send Real-Time Coordinates

Modify your existing Python script to send coordinate updates via ZMQ instead of writing to cmd.txt. We’ll use the REQ/REP pattern to confirm FFmpeg receives each command, and keep your 1.5s time sync compensation:

import zmq
import time

# Initialize ZMQ client
context = zmq.Context()
socket = context.socket(zmq.REQ)
socket.connect("tcp://localhost:5555")

while True:
    # Replace this with your logic to get the loopback device's input timestamp
    input_timestamp = time.time()
    # Apply 1.5s delay compensation
    target_timestamp = input_timestamp + 1.5
    # Replace with your real-time x/y coordinate data
    x_coord = 752
    y_coord = 480

    # Format command to match FFmpeg's expected syntax (same as sendcmd)
    cmd = f"{target_timestamp:.7f} drawtext reinit 'x={x_coord}:y={y_coord}';"
    
    # Send command and wait for confirmation
    socket.send_string(cmd)
    response = socket.recv_string()
    print(f"FFmpeg confirmed command: {response}")

    # Adjust sleep interval to match your data update frequency (e.g., 30fps = ~0.033s)
    time.sleep(0.033)

Critical Notes for Time Sync

  • Match Timestamp Format: Ensure your target timestamp uses the same Unix timestamp precision as your video source (you’re already doing this with .7f decimal places, which is perfect).
  • Start Order: Launch the FFmpeg command first, then start your Python script—this ensures the ZMQ socket is ready to receive commands.
  • REQ/REP vs PUB/SUB: We used REQ/REP here to confirm FFmpeg processes each command. If you need higher throughput (and don’t need confirmation), you can switch to PUB/SUB mode by modifying both the FFmpeg zmq filter arguments and Python socket type.

内容的提问来源于stack exchange,提问作者DavidK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:27:00