以下提供 3 个实用 Shell 脚本,适配园区24h 定时分段录制、多摄像头批量预处理、历史录像自动压缩场景,可直接部署在 Linux 服务器(CentOS/Ubuntu)上,支持后台运行、日志记录,降低人工运维成本。
脚本 1:单摄像头 24h 定时分段录制(核心脚本)
功能说明
- 拉取 RTSP 摄像头流,按1小时/段自动分割文件
- 按「日期_时间_摄像头ID」命名,便于检索(如
20260112_100000_cam001.mp4) - 记录运行日志,异常中断自动打印错误信息
- 强制 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
脚本使用说明
- 修改配置参数(
RTSP_URL、CAMERA_ID、SAVE_DIR)为园区实际信息 - 赋予执行权限:
chmod +x camera_record.sh - 后台运行(避免终端关闭中断):
nohup ./camera_record.sh & - 查看日志:
tail -f /data/park/logs/cam001_record.log
脚本 2:多摄像头录像批量 AI 预处理
功能说明
- 遍历指定目录下所有监控录像,批量完成「分辨率统一(720P)+ 帧率调整(15fps)+ 去除音频」
- 适配 AI 分析模型输入要求,减少算力消耗
- 处理完成后保留原文件,输出文件添加
_ai_pre后缀 - 支持断点续跑,跳过已处理完成的文件
脚本代码(保存为 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
脚本使用说明
- 修改配置参数(
INPUT_DIR、OUTPUT_DIR)为园区实际目录 - 赋予执行权限:
chmod +x batch_ai_preprocess.sh - 运行脚本(批量处理耗时较长,建议后台运行):
nohup ./batch_ai_preprocess.sh & - 查看处理进度:
tail -f /data/park/logs/batch_ai_preprocess.log
脚本 3:历史录像自动压缩(H.265 编码,节省 50% 存储)
功能说明
- 压缩指定天数前的历史录像(默认 7 天),将 H.264 转为 H.265 编码
- 压缩完成后可选择删除原文件(节省存储空间)
- 按日期筛选,避免压缩最新录像
- 日志记录压缩进度和空间节省情况
脚本代码(保存为 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
脚本使用说明
-
修改配置参数(
RECORD_DIR、KEEP_DAYS、DELETE_ORGINAL) -
赋予执行权限:
chmod +x history_record_compress.sh -
建议通过
crontab定时执行(如每周日凌晨 2 点):bash# 编辑定时任务 crontab -e # 添加以下内容(每周日凌晨2点执行) 0 2 * * 0 /data/park/scripts/history_record_compress.sh -
查看压缩日志:
tail -f /data/park/logs/history_record_compress.log
脚本部署与运维注意事项
- 环境准备 :确保服务器已安装 FFmpeg(
ffmpeg -version验证) - 存储规划:提前规划录像目录的磁盘空间,避免存储溢出
- 日志清理:定期清理日志文件(可添加定时任务删除 30 天前的日志)
- 权限配置:脚本运行用户需拥有录像目录的「读/写/执行」权限
- 后台运行 :长时间运行的脚本(如录制脚本)使用
nohup或screen保持后台运行