【FFmpeg 智慧园区场景应用】2.自动化处理 Shell 脚本

以下提供 3 个实用 Shell 脚本,适配园区24h 定时分段录制、多摄像头批量预处理、历史录像自动压缩场景,可直接部署在 Linux 服务器(CentOS/Ubuntu)上,支持后台运行、日志记录,降低人工运维成本。

脚本 1:单摄像头 24h 定时分段录制(核心脚本)

功能说明

  1. 拉取 RTSP 摄像头流,按1小时/段自动分割文件
  2. 按「日期_时间_摄像头ID」命名,便于检索(如 20260112_100000_cam001.mp4
  3. 记录运行日志,异常中断自动打印错误信息
  4. 强制 TCP 传输,避免园区网络丢包,提高录制稳定性

脚本代码(保存为 camera_record.sh

bash 复制代码
#!/bin/bash
# 智慧园区摄像头自动分段录制脚本
# 配置参数(根据园区实际情况修改)
RTSP_URL="rtsp://admin:123456@192.168.1.100:554/stream1"  # 摄像头RTSP地址
CAMERA_ID="cam001"  # 摄像头编号(用于文件命名)
SAVE_DIR="/data/park/record"  # 录像保存目录
SEGMENT_TIME=3600  # 每段录像时长(秒),1小时=3600秒
LOG_FILE="/data/park/logs/camera_${CAMERA_ID}_record.log"  # 日志文件路径

# 步骤1:创建保存目录和日志目录
mkdir -p ${SAVE_DIR}
mkdir -p $(dirname ${LOG_FILE})

# 步骤2:写入启动日志
echo "=====================================" >> ${LOG_FILE}
echo "$(date +'%Y-%m-%d %H:%M:%S') - 摄像头${CAMERA_ID}录制脚本启动" >> ${LOG_FILE}
echo "RTSP地址:${RTSP_URL}" >> ${LOG_FILE}
echo "录像保存目录:${SAVE_DIR}" >> ${LOG_FILE}
echo "每段时长:${SEGMENT_TIME}秒" >> ${LOG_FILE}

# 步骤3:执行FFmpeg分段录制
ffmpeg -y \
-rtsp_transport tcp \
-i ${RTSP_URL} \
-c copy \
-f segment \
-segment_time ${SEGMENT_TIME} \
-segment_format mp4 \
-segment_filename "${SAVE_DIR}/${CAMERA_ID}_%Y%m%d_%H%M%S.mp4" \
-v error \
>> ${LOG_FILE} 2>&1

# 步骤4:写入异常日志(若FFmpeg执行失败)
if [ $? -ne 0 ]; then
    echo "$(date +'%Y-%m-%d %H:%M:%S') - 摄像头${CAMERA_ID}录制异常,已停止" >> ${LOG_FILE}
    exit 1
else
    echo "$(date +'%Y-%m-%d %H:%M:%S') - 摄像头${CAMERA_ID}录制脚本正常退出" >> ${LOG_FILE}
    exit 0
fi

脚本使用说明

  1. 修改配置参数(RTSP_URLCAMERA_IDSAVE_DIR)为园区实际信息
  2. 赋予执行权限:chmod +x camera_record.sh
  3. 后台运行(避免终端关闭中断):nohup ./camera_record.sh &
  4. 查看日志:tail -f /data/park/logs/cam001_record.log

脚本 2:多摄像头录像批量 AI 预处理

功能说明

  1. 遍历指定目录下所有监控录像,批量完成「分辨率统一(720P)+ 帧率调整(15fps)+ 去除音频」
  2. 适配 AI 分析模型输入要求,减少算力消耗
  3. 处理完成后保留原文件,输出文件添加 _ai_pre 后缀
  4. 支持断点续跑,跳过已处理完成的文件

脚本代码(保存为 batch_ai_preprocess.sh

bash 复制代码
#!/bin/bash
# 智慧园区录像批量AI预处理脚本
# 配置参数
INPUT_DIR="/data/park/record"  # 原始录像目录
OUTPUT_DIR="/data/park/ai_input"  # 预处理后保存目录
TARGET_RES="1280x720"  # AI模型目标分辨率(720P)
TARGET_FPS=15  # AI模型目标帧率
LOG_FILE="/data/park/logs/batch_ai_preprocess.log"

# 步骤1:创建目录和日志
mkdir -p ${OUTPUT_DIR}
mkdir -p $(dirname ${LOG_FILE})

# 步骤2:写入启动日志
echo "=====================================" >> ${LOG_FILE}
echo "$(date +'%Y-%m-%d %H:%M:%S') - 批量AI预处理脚本启动" >> ${LOG_FILE}
echo "原始目录:${INPUT_DIR}" >> ${LOG_FILE}
echo "输出目录:${OUTPUT_DIR}" >> ${LOG_FILE}
echo "目标分辨率:${TARGET_RES},目标帧率:${TARGET_FPS}fps" >> ${LOG_FILE}

# 步骤3:遍历MP4文件进行预处理
for file in ${INPUT_DIR}/*.mp4; do
    # 获取文件名(不含路径和后缀)
    filename=$(basename ${file} .mp4)
    output_file="${OUTPUT_DIR}/${filename}_ai_pre.mp4"

    # 跳过已处理的文件
    if [ -f ${output_file} ]; then
        echo "$(date +'%Y-%m-%d %H:%M:%S') - 已处理,跳过:${filename}.mp4" >> ${LOG_FILE}
        continue
    fi

    # 执行FFmpeg预处理(去除音频+调整分辨率+调整帧率)
    echo "$(date +'%Y-%m-%d %H:%M:%S') - 正在处理:${filename}.mp4" >> ${LOG_FILE}
    ffmpeg -y \
    -i ${file} \
    -s ${TARGET_RES} \
    -r ${TARGET_FPS} \
    -an \
    -c:v libx264 \
    -preset fast \
    -crf 28 \
    -v error \
    ${output_file} >> ${LOG_FILE} 2>&1

    # 检查处理结果
    if [ $? -eq 0 ]; then
        echo "$(date +'%Y-%m-%d %H:%M:%S') - 处理完成:${filename}.mp4" >> ${LOG_FILE}
    else
        echo "$(date +'%Y-%m-%d %H:%M:%S') - 处理失败:${filename}.mp4" >> ${LOG_FILE}
    fi
done

# 步骤4:写入完成日志
echo "$(date +'%Y-%m-%d %H:%M:%S') - 批量AI预处理脚本执行完毕" >> ${LOG_FILE}
exit 0

脚本使用说明

  1. 修改配置参数(INPUT_DIROUTPUT_DIR)为园区实际目录
  2. 赋予执行权限:chmod +x batch_ai_preprocess.sh
  3. 运行脚本(批量处理耗时较长,建议后台运行):nohup ./batch_ai_preprocess.sh &
  4. 查看处理进度:tail -f /data/park/logs/batch_ai_preprocess.log

脚本 3:历史录像自动压缩(H.265 编码,节省 50% 存储)

功能说明

  1. 压缩指定天数前的历史录像(默认 7 天),将 H.264 转为 H.265 编码
  2. 压缩完成后可选择删除原文件(节省存储空间)
  3. 按日期筛选,避免压缩最新录像
  4. 日志记录压缩进度和空间节省情况

脚本代码(保存为 history_record_compress.sh

bash 复制代码
#!/bin/bash
# 智慧园区历史录像自动压缩脚本(H.264→H.265)
# 配置参数
RECORD_DIR="/data/park/record"  # 录像存储目录
KEEP_DAYS=7  # 保留最新7天的录像不压缩
DELETE_ORGINAL=0  # 压缩后是否删除原文件(0=不删除,1=删除)
LOG_FILE="/data/park/logs/history_record_compress.log"

# 步骤1:创建日志目录
mkdir -p $(dirname ${LOG_FILE})

# 步骤2:写入启动日志
echo "=====================================" >> ${LOG_FILE}
echo "$(date +'%Y-%m-%d %H:%M:%S') - 历史录像压缩脚本启动" >> ${LOG_FILE}
echo "录像目录:${RECORD_DIR}" >> ${LOG_FILE}
echo "保留最新${KEEP_DAYS}天录像,压缩后删除原文件:$(if [ ${DELETE_ORGINAL} -eq 1 ]; then echo "是"; else echo "否"; fi)" >> ${LOG_FILE}

# 步骤3:筛选并压缩指定天数前的MP4文件
find ${RECORD_DIR} -type f -name "*.mp4" \
-mtime +${KEEP_DAYS} \
-not -name "*_compressed.mp4" | while read file; do
    # 定义压缩后文件名
    compressed_file="${file%.mp4}_compressed.mp4"

    # 跳过已压缩的文件
    if [ -f ${compressed_file} ]; then
        echo "$(date +'%Y-%m-%d %H:%M:%S') - 已压缩,跳过:$(basename ${file})" >> ${LOG_FILE}
        continue
    fi

    # 记录原文件大小
    original_size=$(du -h ${file} | awk '{print $1}')

    # 执行FFmpeg H.265压缩
    echo "$(date +'%Y-%m-%d %H:%M:%S') - 正在压缩:$(basename ${file})(原大小:${original_size})" >> ${LOG_FILE}
    ffmpeg -y \
    -i ${file} \
    -c:v libx265 \
    -crf 28 \
    -c:a aac \
    -preset medium \
    -v error \
    ${compressed_file} >> ${LOG_FILE} 2>&1

    # 检查压缩结果并处理原文件
    if [ $? -eq 0 ]; then
        compressed_size=$(du -h ${compressed_file} | awk '{print $1}')
        echo "$(date +'%Y-%m-%d %H:%M:%S') - 压缩完成:$(basename ${compressed_file})(压缩后大小:${compressed_size})" >> ${LOG_FILE}

        # 删除原文件(若配置开启)
        if [ ${DELETE_ORGINAL} -eq 1 ]; then
            rm -f ${file}
            echo "$(date +'%Y-%m-%d %H:%M:%S') - 已删除原文件:$(basename ${file})" >> ${LOG_FILE}
        fi
    else
        echo "$(date +'%Y-%m-%d %H:%M:%S') - 压缩失败:$(basename ${file})" >> ${LOG_FILE}
        # 删除损坏的压缩文件
        rm -f ${compressed_file}
    fi
done

# 步骤4:写入完成日志
echo "$(date +'%Y-%m-%d %H:%M:%S') - 历史录像压缩脚本执行完毕" >> ${LOG_FILE}
exit 0

脚本使用说明

  1. 修改配置参数(RECORD_DIRKEEP_DAYSDELETE_ORGINAL

  2. 赋予执行权限:chmod +x history_record_compress.sh

  3. 建议通过 crontab 定时执行(如每周日凌晨 2 点):

    bash 复制代码
    # 编辑定时任务
    crontab -e
    # 添加以下内容(每周日凌晨2点执行)
    0 2 * * 0 /data/park/scripts/history_record_compress.sh
  4. 查看压缩日志:tail -f /data/park/logs/history_record_compress.log

脚本部署与运维注意事项

  1. 环境准备 :确保服务器已安装 FFmpeg(ffmpeg -version 验证)
  2. 存储规划:提前规划录像目录的磁盘空间,避免存储溢出
  3. 日志清理:定期清理日志文件(可添加定时任务删除 30 天前的日志)
  4. 权限配置:脚本运行用户需拥有录像目录的「读/写/执行」权限
  5. 后台运行 :长时间运行的脚本(如录制脚本)使用 nohupscreen 保持后台运行
相关推荐
Leinwin7 小时前
OpenClaw 多 Agent 协作框架的并发限制与企业化规避方案痛点直击
java·运维·数据库
2401_865382507 小时前
信息化项目运维与运营的区别
运维·运营·信息化项目·政务信息化
漠北的哈士奇7 小时前
VMware Workstation导入ova文件时出现闪退但是没有报错信息
运维·vmware·虚拟机·闪退·ova
如意.7597 小时前
【Linux开发工具实战】Git、GDB与CGDB从入门到精通
linux·运维·git
运维小欣8 小时前
智能体选型实战指南
运维·人工智能
yy55278 小时前
Nginx 性能优化与监控
运维·nginx·性能优化
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ9 小时前
Linux 查询某进程文件所在路径 命令
linux·运维·服务器
05大叔10 小时前
网络基础知识 域名,JSON格式,AI基础
运维·服务器·网络
安当加密11 小时前
无需改 PAM!轻量级 RADIUS + ASP身份认证系统 实现 Linux 登录双因子认证
linux·运维·服务器
dashizhi201511 小时前
服务器共享禁止保存到本地磁盘、共享文件禁止另存为本地磁盘、移动硬盘等
运维·网络·stm32·安全·电脑