ffmpeg视频切片

#!/bin/bash

# ===================== 配置参数 =====================
# 视频源目录(会自动拼接当天日期)
VIDEO_BASE_DIR="/var/www/html/shequ/activity/public/uploads"
# 图片输出目录(与视频同目录,也可自定义)
OUTPUT_BASE_DIR="${VIDEO_BASE_DIR}"
# 截取间隔(秒)
INTERVAL=10
# 脚本锁文件(用于防止重复执行)
LOCK_FILE="/tmp/video_screenshot.lock"
# 日志文件
LOG_FILE="/var/log/video_screenshot.log"

# ===================== 核心逻辑 =====================
# 1. 检查是否已有任务在执行
if [ -f "${LOCK_FILE}" ]; then
    echo "[$(date +'%Y-%m-%d %H:%M:%S')] 检测到已有任务在执行,本次跳过" >> "${LOG_FILE}"
    exit 0
fi

# 2. 创建锁文件
touch "${LOCK_FILE}"
trap 'rm -f "${LOCK_FILE}"; exit' EXIT  # 脚本退出时自动删除锁文件

# 3. 获取当天日期(格式:20251219)
TODAY=$(date +'%Y%m%d')
VIDEO_DIR="${VIDEO_BASE_DIR}/${TODAY}"

# 4. 检查目录是否存在
if [ ! -d "${VIDEO_DIR}" ]; then
    echo "[$(date +'%Y-%m-%d %H:%M:%S')] 目录 ${VIDEO_DIR} 不存在,本次跳过" >> "${LOG_FILE}"
    exit 0
fi

# 5. 遍历目录下的视频文件(支持常见格式:mp4、avi、mov、mkv)
VIDEO_FORMATS=("mp4" "avi" "mov" "mkv")
for FORMAT in "${VIDEO_FORMATS[@]}"; do
    for VIDEO_FILE in "${VIDEO_DIR}"/*.${FORMAT}; do
        # 跳过不存在的文件(比如目录下无该格式视频时)
        [ -f "${VIDEO_FILE}" ] || continue

        # 获取视频文件名(不含路径和后缀)
        VIDEO_NAME=$(basename "${VIDEO_FILE}" .${FORMAT})
        OUTPUT_DIR="${OUTPUT_BASE_DIR}/${TODAY}/${VIDEO_NAME}"
        # 如果输出的目录已经存在,说明这个视频文件已经处理过了,不需要重复处理
        if [ -d "${OUTPUT_DIR}" ]; then
            continue  # 跳过当前视频,处理下一个
        fi
        # 创建截图输出目录
        mkdir -p "${OUTPUT_DIR}"

        echo "[$(date +'%Y-%m-%d %H:%M:%S')] 开始处理视频:${VIDEO_FILE}" >> "${LOG_FILE}"
        
        # 使用ffmpeg每10秒截取一帧,命名为 视频名+序号.jpg
        # -vf fps=1/${INTERVAL}:每INTERVAL秒1帧;%04d:4位序号(如0001、0002)
        ffmpeg -i "${VIDEO_FILE}" -vf fps=1/${INTERVAL} -q:v 2 "${OUTPUT_DIR}/%04d.jpg" -y >> "${LOG_FILE}" 2>&1
        
        if [ $? -eq 0 ]; then
            echo "[$(date +'%Y-%m-%d %H:%M:%S')] 视频 ${VIDEO_FILE} 处理完成" >> "${LOG_FILE}"
        else
            echo "[$(date +'%Y-%m-%d %H:%M:%S')] 视频 ${VIDEO_FILE} 处理失败" >> "${LOG_FILE}"
        fi
    done
done

# 6. 脚本执行完成(锁文件会被trap自动删除)
echo "[$(date +'%Y-%m-%d %H:%M:%S')] 本次任务执行完成" >> "${LOG_FILE}"
exit 0
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容