1. 项目背景与需求分析
在智慧园区视频监控系统中,FFmpeg作为核心的视频处理工具,经常被用于RTSP流拉取、视频转码、移动侦测等场景。传统的告警通知方式多采用邮件发送,但在实际运维中我们发现几个明显痛点:
- 邮件存在延迟(平均3-5分钟到达)
- 移动端查看不便(需要登录邮箱客户端)
- 容易被归类为垃圾邮件
- 无法实现快速响应(缺少即时交互能力)
以某园区实际案例为例:当FFmpeg检测到周界入侵时,原有邮件告警系统导致安保人员平均响应时间达8分钟,而改用企业微信机器人后缩短至47秒。这正是我们需要用即时通讯工具替代邮件告警的核心价值。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术方案选型对比
2.1 主流IM机器人接口对比
| 特性 | 企业微信机器人 | 钉钉机器人 | 飞书机器人 |
|---|---|---|---|
| 消息速率限制 | 20条/分钟 | 20条/分钟 | 5条/秒 |
| 富文本支持 | Markdown/图文 | Markdown/卡片 | Markdown/交互卡片 |
| 文件上传 | 需先传素材库 | 直接上传 | 直接上传 |
| 安全机制 | IP白名单+密钥 | 签名算法 | 签名算法 |
| 历史消息保存 | 7天 | 7天 | 180天 |
2.2 FFmpeg告警触发设计
推荐采用运动检测+区域入侵双条件触发:
bash复制ffmpeg -i rtsp://camera-ip -vf \
"motdet=threshold=0.5, \
zones=draw=box:x=100:y=100:w=200:h=200:trigger=1" \
-f null - 2>&1 | grep "motion detected" > alert.log
关键参数说明:
threshold=0.5:运动敏感度(0-1)zones:设置检测区域坐标trigger=1:区域入侵触发标志
3. 企业微信机器人配置详解
3.1 创建群机器人步骤
- 右键点击目标群聊 → 选择「添加群机器人」
- 点击「自定义」类型机器人
- 设置机器人名称(如"FFmpeg监控告警")
- 记录Webhook地址中的key参数(后续用于签名)
注意:2023年10月后企业微信更新了机器人安全策略,必须同时配置IP白名单和签名校验
3.2 消息推送脚本实现
bash复制#!/bin/bash
WEBHOOK_KEY="your_webhook_key"
ALERT_MSG=$(cat alert.log | head -n 1)
# 生成签名(企业微信新版要求)
timestamp=$(date +%s)
nonce=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 16)
signature=$(echo -ne "$timestamp\n$nonce\n$WEBHOOK_KEY" | openssl dgst -sha256 -binary | base64)
# 构造JSON报文
JSON_DATA=$(cat <<EOF
{
"msgtype": "markdown",
"markdown": {
"content": "**园区告警**\n> 时间: $(date '+%Y-%m-%d %H:%M:%S')\n\n检测到异常事件:\n\`\`\`\n$ALERT_MSG\n\`\`\`\n[点击查看实时画面](rtsp://monitor-center/live)"
},
"timestamp": "$timestamp",
"nonce": "$nonce",
"sign": "$signature"
}
EOF
)
# 发送请求
curl -X POST \
-H "Content-Type: application/json" \
-d "$JSON_DATA" \
"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=$WEBHOOK_KEY"
关键改进点:
- 新版签名算法兼容
- 包含RTSP直连地址
- Markdown格式化输出
- 时间戳自动生成
4. 钉钉机器人特殊配置
4.1 安全加固配置
钉钉要求所有请求必须包含签名头:
bash复制# 生成签名
timestamp=$(date +%s)'000'
sign=$(echo -ne "$timestamp\n$WEBHOOK_SECRET" | openssl dgst -sha256 -binary | base64)
# 请求头添加
-H "timestamp: $timestamp" \
-H "sign: $sign"
4.2 消息卡片优化示例
json复制{
"msgtype": "action_card",
"action_card": {
"title": "周界入侵告警",
"text": "**东区3号摄像头**检测到人员闯入\n时间:$(date '+%H:%M:%S')",
"btn_orientation": "1",
"btns": [
{
"title": "确认处理",
"action_url": "http://ops-system/ack?alert_id=123"
}
]
}
}
5. 生产环境部署要点
5.1 性能优化方案
- 消息队列缓冲:使用Redis做告警去重
bash复制# 使用Redis实现5分钟内相同告警不重复发送
redis-cli --eval dedup.lua $CAMERA_ID $EVENT_TYPE , 300
- FFmpeg进程守护脚本:
bash复制while true; do
if ! pgrep -f "ffmpeg.*rtsp"; then
nohup ffmpeg [参数] > /dev/null 2>&1 &
fi
sleep 30
done
5.2 监控指标采集
建议采集以下关键指标:
bash复制# 消息送达延迟监控
curl -o /dev/null -w "%{time_total}" $WEBHOOK_URL | \
awk '{print "webhook_latency " $1}' | \
curl --data-binary @- $PROMETHEUS_PUSHGW
# FFmpeg进程状态
ps aux | grep ffmpeg | awk '{print "ffmpeg_status " $8=="D"?1:0}' | \
curl --data-binary @- $PROMETHEUS_PUSHGW
6. 故障排查手册
6.1 常见错误代码
| 错误码 | 原因 | 解决方案 |
|---|---|---|
| 93000 | IP不在白名单 | 检查企业微信后台-机器人安全设置 |
| 94000 | 签名错误 | 确认timestamp单位是秒(钉钉用毫秒) |
| 94001 | 请求过期(5分钟) | 检查服务器时间是否同步 |
| 45009 | 接口限频 | 增加消息去重逻辑 |
6.2 日志分析技巧
使用jq工具解析返回报文:
bash复制curl -s [URL] | jq '.errcode'
if [ $? -ne 0 ]; then
echo "API响应格式异常" >> /var/log/alert-agent.log
fi
推荐日志格式:
code复制[2023-08-15T14:32:45+08:00] INFO - Sent alert to wecom: camera=EAST-03 code=0
[2023-08-15T14:33:12+08:00] ERROR - Dingtalk response: {"errcode":94001}
7. 进阶功能扩展
7.1 视频片段推送
- 用FFmpeg截取告警前10秒视频:
bash复制ffmpeg -ss -10 -i rtsp://cam-ip -c copy -f mp4 alert-clip.mp4
- 企业微信素材上传:
bash复制MEDIA_ID=$(curl -F "[email protected]" \
"https://qyapi.weixin.qq.com/cgi-bin/webhook/upload_media?key=$KEY&type=file" | jq -r '.media_id')
- 在消息体中附加:
json复制"file": { "media_id": "$MEDIA_ID" }
7.2 智能分析联动
对接AI分析平台示例:
python复制import requests
analysis_res = requests.post("http://ai-platform/api", json={
"image_url": camera.snapshot_url,
"rules": ["person", "vehicle"]
})
if analysis_res.json().get("person_count", 0) > 0:
trigger_alert()
实际部署中发现三个关键经验:
- 企业微信的IP白名单需要同时配置出向IP(容易遗漏NAT地址)
- 钉钉的签名参数中,timestamp需要额外乘以1000
- FFmpeg运动检测建议设置
-reset 300参数,避免持续告警
