批量压缩对象存储中视频

脚本说明与注意事项

  1. 运行环境 :此脚本需要在能访问到视频文件的服务器(如转码服务器)上运行。
  2. 对象存储挂载 :
    • 如果您的对象存储(MinIO/Ceph)已经挂载为本地目录(例如通过 S3FS 挂载到了 /mnt/video_source),直接配置路径即可。
    • 如果是纯API对接,需要配合 mc (MinIO Client) 先下载后上传。本脚本默认采用"本地目录/挂载盘"模式,这是最通用的方式。
  3. 关键优化 :
    • 我主动帮您加上了 -movflags +faststart 参数 。虽然您提供的命令里没写,但作为点播系统,必须加这个参数,否则浏览器无法"边下边播"。
    • 增加了幂等性检查:如果目标文件已存在且大小正常,会自动跳过,防止重复跑。

脚本内容 (batch_transcode.sh)

您可以直接复制以下内容保存为 batch_transcode.sh。

bash 复制代码
#!/bin/bash

# ================= 配置区域 =================
# 源视频目录 (对象存储挂载目录或原始文件目录)
SOURCE_DIR="/data/videos/raw"

# 输出视频目录 (转码后的存放目录,建议与源分开,确认无误后再替换)
OUTPUT_DIR="/data/videos/optimized"

# 日志文件路径
LOG_FILE="./transcode_task.log"

# 设置并发数量 (H.265非常消耗CPU,建议设置为 CPU核心数 / 2)
# 如果服务器要同时响应其他请求,请设为 1 保持单线程处理
MAX_JOBS=1
# ===========================================

# 检查 FFmpeg 是否安装
if ! command -v ffmpeg &> /dev/null; then
    echo "错误: 未找到 ffmpeg,请先安装。"
    exit 1
fi

# 创建输出目录
mkdir -p "$OUTPUT_DIR"

echo "=== 开始批量压缩任务 ===" | tee -a "$LOG_FILE"
echo "源目录: $SOURCE_DIR" | tee -a "$LOG_FILE"
echo "输出目录: $OUTPUT_DIR" | tee -a "$LOG_FILE"
echo "开始时间: $(date)" | tee -a "$LOG_FILE"

# 统计计数器
count_success=0
count_skip=0
count_fail=0

# 递归查找所有 .mp4 文件
# 注意:处理文件名中的空格
find "$SOURCE_DIR" -type f -name "*.mp4" | while read -r input_file; do
    
    # 1. 构建输出文件路径
    # 获取相对路径,保持原有的目录结构
    relative_path="${input_file#$SOURCE_DIR/}"
    output_file="$OUTPUT_DIR/$relative_path"
    output_dir_path=$(dirname "$output_file")
    
    # 自动创建子目录
    mkdir -p "$output_dir_path"

    # 2. 检查是否已处理(防止重复跑)
    if [ -f "$output_file" ]; then
        # 如果目标文件存在,且大小大于 1KB (防止之前的空文件),则跳过
        if [ $(stat -c%s "$output_file") -gt 1024 ]; then
            echo "[跳过] 文件已存在: $relative_path" | tee -a "$LOG_FILE"
            continue
        fi
    fi

    echo "------------------------------------------------" | tee -a "$LOG_FILE"
    echo "[正在处理] $input_file ..." | tee -a "$LOG_FILE"

    # 3. 执行 FFmpeg 命令
    # -y: 覆盖输出文件
    # -nostdin: 防止ffmpeg吞掉while循环的标准输入
    # -movflags +faststart: 必须加!确保Web端能秒开播放
    
    ffmpeg -y -nostdin -i "$input_file" \
        -c:v libx265 \
        -preset medium \
        -crf 28 \
        -r 15 \
        -tag:v hvc1 \
        -c:a aac -b:a 64k \
        -movflags +faststart \
        "$output_file" < /dev/null >> "$LOG_FILE" 2>&1

    # 4. 检查转码结果
    if [ $? -eq 0 ]; then
        # 获取压缩率
        orig_size=$(du -h "$input_file" | cut -f1)
        new_size=$(du -h "$output_file" | cut -f1)
        echo "[成功] $relative_path (原: $orig_size -> 新: $new_size)" | tee -a "$LOG_FILE"
        # 可以在这里添加删除源文件的命令,但建议人工确认后再删
        # rm "$input_file" 
    else
        echo "[失败] $relative_path - 请查看日志详情" | tee -a "$LOG_FILE"
        # 如果生成了错误的空文件,删除它
        rm -f "$output_file"
    fi

done

echo "================================================" | tee -a "$LOG_FILE"
echo "任务结束时间: $(date)" | tee -a "$LOG_FILE"
echo "日志已保存至: $LOG_FILE"

如何使用

  1. 保存脚本 :将上述代码保存为 transcode.sh。

  2. 赋予权限 :

    bash 复制代码
    chmod +x transcode.sh
  3. 修改路径 :
    使用 vim transcode.sh 修改前几行的配置:

    • SOURCE_DIR: 指向您存放原始大文件的目录。
    • OUTPUT_DIR: 指定您希望存放处理后文件的目录。
  4. 后台运行 (推荐):
    由于视频压缩非常耗时(H.265可能只有 2-5倍 实时速度),建议使用 nohup 挂在后台运行,防止SSH断开导致任务中断。

    bash 复制代码
    nohup ./transcode.sh > /dev/null 2>&1 &
  5. 查看进度 :

    bash 复制代码
    tail -f transcode_task.log

特别提醒:关于 H.265 的浏览器兼容性

您既然决定使用 H.265 (HEVC),请务必告知前端开发人员注意以下事项:

  1. 浏览器支持现状 :
    • Safari (iOS/Mac):完美支持(原生硬件解码)。
    • Chrome / Edge:104+ 版本才开始较好支持,且通常依赖硬件加速。
    • Firefox:支持较差。
  2. 解决方案 :
    您之前提到的 XGPlayer (西瓜播放器) 支持集成 H.265 软解插件。
    务必让前端引入 xgplayer-h265 插件 ,否则部分旧电脑的 Chrome 浏览器可能会出现 "只有声音没画面" 的情况。

如果为了绝对的兼容性而不使用插件,请改回 H.264,但如果能控制前端播放器环境,H.265 是节省带宽的最佳选择。

相关推荐
狗凯之家源码网12 小时前
吃瓜主题 3.0 视频源码深度评测与实战指南
音视频
美狐美颜sdk16 小时前
视频美颜SDK中的YUV与RGBA格式有什么区别?直播APP开发解析
人工智能·计算机视觉·音视频·美颜sdk·直播美颜sdk·视频美颜sdk
音视频牛哥16 小时前
不止于超低延迟:SmartMediaKit iOS Unity3D RTSP/RTMP 播放器的核心竞争力
音视频·unity3d rtsp播放器·unity3d rtmp播放器·smartmediakit·ios unity rtsp·ios unity rtmp·unity3d ios播放器
辰辰观影19 小时前
网盘视频播放器怎么选?2026全平台推荐
经验分享·音视频
guhy fighting20 小时前
怎么去除视频的logo?现在有方法了,使用Remove Logo Now快速去除视频logo
音视频
呆呆的猫20 小时前
【视频生成】2、VDN-MiniMax-H3
音视频
沐禾安信21 小时前
MOV转MP4怎么转换?苹果视频打不开这样解决
音视频·格式转换·mov转mp4
小豆庄21 小时前
视频隐私脱敏怎么处理:识别追踪与本地方案的选型思路
密码学·音视频·视频
七牛云行业应用1 天前
爆火OpenFilm 0.2.6:开源 AI 视频 Agent 的安装、编辑与渲染流程(2026 年 10 月 )
人工智能·开源·音视频
码匠许师傅1 天前
【C++三方组件】FFmpeg:音视频处理的瑞士军刀
c++·ffmpeg·音视频