【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 保持后台运行
相关推荐
昱景2 小时前
自动化锡膏管理设备亲测效果分享
自动化
Goona_2 小时前
PyQt+Excel学生信息管理系统,增删改查全开源
python·小程序·自动化·excel·交互·pyqt
叫我辉哥e12 小时前
新手进阶Python:办公看板集成OA自动化+AI提醒+定时任务
人工智能·python·自动化
Ghost Face...2 小时前
SoC启动流程详解:从Bootrom到多核负载均衡
运维·负载均衡
EverydayJoy^v^2 小时前
RH134学习进程——三.分析与存储日志
运维·服务器·网络
北京耐用通信2 小时前
从“电缆束缚”到“光纤自由”:耐达讯自动化Profibus总线光纤中继器在化工通信的跨越式升级
人工智能·科技·物联网·自动化·信息与通信
篱笆院的狗2 小时前
yum install 发生 Cannot find a valid baseurl for repo: centos-sclo-rh/x86_64
linux·运维·centos
磊磊cpp2 小时前
Ubuntu 22.04 手动安装 XRDP(RDP 远程桌面)教程
linux·运维·ubuntu
2401_865854882 小时前
云服务器有哪些支持win10的
运维·服务器