【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 保持后台运行
相关推荐
做人不要太理性10 分钟前
CANN Runtime 运行时与维测组件:异构任务调度、显存池管理与全链路异常诊断机制解析
人工智能·自动化
酷酷的崽79812 分钟前
CANN 生态可维护性与可观测性:构建生产级边缘 AI 系统的运维体系
运维·人工智能
做人不要太理性17 分钟前
CANN Runtime 运行时组件深度解析:任务调度机制、存储管理策略与维测体系构建逻辑
android·运维·魔珐星云
souyuanzhanvip27 分钟前
ServerBox v1.0.1316 跨平台 Linux 服务器管理工具
linux·运维·服务器
池央27 分钟前
CANN oam-tools 诊断体系深度解析:自动化信息采集、AI Core 异常解析与 CI/CD 流水线集成策略
人工智能·ci/cd·自动化
依米阳光0832 分钟前
Playwright MCP AI实现自动化UI测试
ui·自动化·playwright·mcp
文静小土豆36 分钟前
Docker 与 containerd 代理配置详解:镜像拉取速度慢的终极解决方案
运维·docker·容器
YongCheng_Liang1 小时前
从零开始学 Python:自动化 / 运维开发实战(核心库 + 3 大实战场景)
python·自动化·运维开发
鸽芷咕1 小时前
为什么越来越多开发者转向 CANN 仓库中的 Python 自动化方案?
python·microsoft·自动化·cann
HalvmånEver2 小时前
Linux:线程互斥
java·linux·运维