1. 项目背景与需求解析
在智慧园区视频监控系统中,FFmpeg作为核心的视频处理工具,经常被用于RTSP流拉取、视频转码、移动侦测等关键功能。传统监控系统通常采用邮件告警方式,但在实际运维中我们发现几个痛点:
- 邮件存在延迟问题,紧急事件无法及时触达
- 运维人员可能错过混杂在大量邮件中的告警信息
- 邮件内容格式化程度低,关键信息提取效率差
企业微信/钉钉机器人告警方案的优势在于:
- 消息实时推送至移动端,响应速度提升80%以上
- 支持富文本格式(Markdown/卡片消息)
- 可@特定责任人,确保告警必达
- 提供消息回执确认机制
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与前置条件
2.1 基础组件清单
| 组件 | 版本要求 | 作用说明 |
|---|---|---|
| FFmpeg | ≥4.3 | 视频流处理核心 |
| curl | ≥7.64 | HTTP请求工具 |
| jq | ≥1.6 | JSON处理工具 |
| bash | ≥4.2 | 脚本执行环境 |
2.2 机器人创建指南
企业微信机器人:
- 进入目标群聊 → 右上角群设置
- 添加机器人 → 自定义名称(如"监控告警")
- 复制Webhook地址(格式:
https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx)
钉钉机器人:
- 群设置 → 智能群助手
- 添加机器人 → 自定义类型
- 安全设置建议选择"加签"
- 记录access_token和secret
注意:企业微信机器人需开启消息推送权限,钉钉机器人需配置IP白名单
3. 告警脚本核心实现
3.1 FFmpeg移动侦测配置
bash复制ffmpeg -i rtsp://camera_stream \
-vf "movdet=mode=mixture:threshold=500" \
-f null - 2>&1 | grep -E "movdet|motion"
关键参数说明:
mode=mixture:混合检测模式(兼顾准确性和性能)threshold=500:敏感度阈值(根据场景调整)- 输出通过管道传递给grep过滤关键帧
3.2 企业微信消息推送脚本
bash复制#!/bin/bash
WEBHOOK_URL="https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx"
generate_alert(){
local camera_id=$1
local timestamp=$(date "+%Y-%m-%d %H:%M:%S")
cat <<EOF
{
"msgtype": "markdown",
"markdown": {
"content": "**监控告警** \n> 摄像头: ${camera_id}\n> 时间: ${timestamp}\n> 事件: 移动物体检测\n\n[点击查看实时画面](rtsp://camera_stream)"
},
"at": {
"atMobiles": ["13800138000"],
"isAtAll": false
}
}
EOF
}
# 调用示例
curl -X POST $WEBHOOK_URL \
-H "Content-Type: application/json" \
-d "$(generate_alert "CAM-01")"
3.3 钉钉安全签名实现
bash复制#!/bin/bash
ACCESS_TOKEN="xxx"
SECRET="xxx"
# 生成签名
timestamp=$(date +%s%3N)
sign=$(echo -n "${timestamp}\n${SECRET}" | openssl dgst -sha256 -hmac "${SECRET}" -binary | base64)
send_dingtalk_alert(){
curl "https://oapi.dingtalk.com/robot/send?access_token=${ACCESS_TOKEN}×tamp=${timestamp}&sign=${sign}" \
-H "Content-Type: application/json" \
-d '{
"msgtype": "actionCard",
"actionCard": {
"title": "异常行为告警",
"text": " \n\n **位置**:A栋大堂 \n **时间**:'"$(date '+%Y-%m-%d %H:%M:%S')"'",
"btns": [
{
"title": "处置预案",
"actionURL": "http://wiki/emergency"
}
]
}
}'
}
4. 系统集成方案
4.1 事件触发流程
mermaid复制graph TD
A[FFmpeg检测到运动] --> B{置信度>阈值?}
B -->|是| C[调用告警脚本]
B -->|否| D[继续监控]
C --> E[记录日志]
C --> F[发送机器人消息]
4.2 日志与去重机制
bash复制# 基于Redis的去重实现
check_duplicate(){
local event_id=$1
local expire=300 # 5分钟去重窗口
if redis-cli SETNX "alert:${event_id}" "1" >/dev/null; then
redis-cli EXPIRE "alert:${event_id}" $expire >/dev/null
return 0 # 新事件
else
return 1 # 重复事件
fi
}
5. 高级配置技巧
5.1 多级告警策略
bash复制# 根据运动检测强度分级
if [ $motion_level -gt 500 ]; then
# 一级告警:@所有人
send_alert --level critical
elif [ $motion_level -gt 300 ]; then
# 二级告警:仅通知值班人员
send_alert --level warning
fi
5.2 视频片段上传
bash复制# 捕获告警前后30秒视频
ffmpeg -y -ss -30 -i rtsp://stream -t 60 -c copy alert_$(date +%s).mp4
# 上传至企业微信临时素材
media_id=$(curl -F "media=@alert.mp4" \
"https://qyapi.weixin.qq.com/cgi-bin/webhook/upload_media?key=xxx&type=file" | jq -r .media_id)
6. 常见问题排查
6.1 消息发送失败处理
| 错误码 | 原因 | 解决方案 |
|---|---|---|
| 93000 | IP不在白名单 | 添加服务器IP到机器人安全设置 |
| 88001 | JSON格式错误 | 使用jq工具验证JSON有效性 |
| 310000 | 频率限制 | 添加延时:sleep $((RANDOM%5+1)) |
6.2 FFmpeg检测优化
bash复制# 调整检测区域(只监控重点区域)
-vf "crop=800:600:100:50, movdet=mode=mixture"
# 使用背景建模提高准确性
-vf "bwdif=mode=send_field, movdet=mode=compare"
7. 性能监控方案
7.1 资源占用统计
bash复制# 记录FFmpeg CPU占用
top -bn1 -p $(pgrep ffmpeg) | awk '/ffmpeg/ {print $9}'
# 告警响应时间测量
start=$(date +%s.%N)
send_alert
duration=$(echo "$(date +%s.%N) - $start" | bc)
echo "响应时间: ${duration}秒" >> /var/log/alert_perf.log
7.2 自动恢复机制
bash复制#!/bin/bash
MAX_RETRY=3
check_bot(){
if ! curl -s $WEBHOOK_URL | grep -q "ok"; then
return 1
fi
}
restart_service(){
for ((i=1; i<=$MAX_RETRY; i++)); do
systemctl restart alertbot
sleep 5
if check_bot; then
break
fi
done
}
