Files
devops/docker/stash/scripts/wmv2mp4_batch.sh
T
2025-12-26 11:16:38 +08:00

112 lines
5.2 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# 功能:智能WMV批量转MP4脚本(自动检测硬件编码,适配低性能NAS)
# 特性:1. 自动检测QSV/NVENC硬件编码;2. 支持自定义画质/线程;3. 跳过已转换文件;4. 后台执行友好
# 使用方法:1. 赋予执行权限 chmod +x wmv2mp4_batch.sh2. 放到WMV文件目录执行 ./wmv2mp4_batch.sh
# 自定义参数(可根据需求修改)
CRF_VALUE="23" # 画质参数(20-25最佳,数值越小画质越好、体积越大)
THREADS_NUM="4" # 线程数(适配NAS CPU核心数,4核填4,8核填8)
PRESET_MODE="fast" # 编码预设(ultrafast最快,fast平衡,slow画质最好)
AUDIO_BITRATE="128k" # 音频码率(128k足够日常使用,音质要求高可设192k)
# 定义颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # 恢复默认颜色
# -------------------------- 步骤1:检测FFmpeg是否安装 --------------------------
if ! command -v ffmpeg &> /dev/null; then
echo -e "${RED}错误:未检测到FFmpeg,请先安装FFmpeg${NC}"
exit 1
fi
echo -e "${GREEN}✅ 已检测到FFmpeg,版本:$(ffmpeg -version | head -n1 | awk '{print $3}')${NC}"
# -------------------------- 步骤2:自动检测硬件编码支持 --------------------------
VIDEO_ENCODER="libx264" # 默认软编
ENCODER_TYPE="软件编码"
echo -e "${BLUE}正在检测硬件编码支持...${NC}"
# 检测Intel QSV硬编(绿联NAS Intel机型适用)
if ffmpeg -encoders 2>&1 | grep -q "h264_qsv"; then
VIDEO_ENCODER="h264_qsv"
ENCODER_TYPE="Intel QSV硬件编码"
echo -e "${GREEN}✅ 检测到Intel QSV硬件编码,将使用该编码提速${NC}"
# 检测NVIDIA NVENC硬编(台式机/高性能NAS适用)
elif ffmpeg -encoders 2>&1 | grep -q "h264_nvenc"; then
VIDEO_ENCODER="h264_nvenc"
ENCODER_TYPE="NVIDIA NVENC硬件编码"
echo -e "${GREEN}✅ 检测到NVIDIA NVENC硬件编码,将使用该编码提速${NC}"
else
echo -e "${YELLOW}⚠️ 未检测到硬件编码,将使用libx264软件编码(CPU占用较高)${NC}"
fi
# -------------------------- 步骤3:查找WMV文件 --------------------------
WMV_FILES=($(find . -maxdepth 1 -type f -iname "*.wmv"))
if [[ ${#WMV_FILES[@]} -eq 0 ]]; then
echo -e "${RED}错误:当前目录未找到WMV格式文件!${NC}"
exit 1
fi
echo -e "${BLUE}✅ 共找到 ${#WMV_FILES[@]} 个WMV文件,准备开始转换${NC}"
echo -e "${YELLOW}📌 编码配置:${ENCODER_TYPE} | 画质CRF${CRF_VALUE} | 线程数:${THREADS_NUM} | 编码预设:${PRESET_MODE}${NC}"
echo -e "${YELLOW}📌 转换后文件将保留原文件名,后缀改为.mp4,已存在的MP4文件将跳过${NC}"
read -p "是否开始转换?(y/n) " choice
[[ "$choice" != "y" && "$choice" != "Y" ]] && echo -e "${GREEN}操作已取消${NC}" && exit 0
# -------------------------- 步骤4:批量转换 --------------------------
total_success=0
total_failed=0
failed_files=()
echo -e "${GREEN}=====================================${NC}"
echo -e "${GREEN}开始批量转换(按文件顺序执行)${NC}"
echo -e "${GREEN}=====================================${NC}"
for wmv_file in "${WMV_FILES[@]}"; do
# 生成输出文件名(替换后缀为mp4,保留原文件名)
mp4_file="${wmv_file%.*}.mp4"
# 跳过已存在的MP4文件
if [[ -f "$mp4_file" ]]; then
echo -e "${YELLOW}⚠️ $mp4_file 已存在,跳过转换${NC}"
continue
fi
echo -e "${BLUE}正在转换:$wmv_file$mp4_file${NC}"
echo -e "${BLUE}编码类型:${ENCODER_TYPE},预计耗时取决于文件大小...${NC}"
# 执行转换命令(根据编码类型调整参数)
if [[ "$VIDEO_ENCODER" == "h264_qsv" || "$VIDEO_ENCODER" == "h264_nvenc" ]]; then
# 硬件编码命令(无需preset和threads,硬编自动优化)
ffmpeg -i "$wmv_file" -c:v "$VIDEO_ENCODER" -crf "$CRF_VALUE" -c:a aac -b:a "$AUDIO_BITRATE" -y "$mp4_file" > /dev/null 2>&1
else
# 软件编码命令(指定线程和预设)
ffmpeg -i "$wmv_file" -c:v "$VIDEO_ENCODER" -crf "$CRF_VALUE" -threads "$THREADS_NUM" -preset "$PRESET_MODE" -c:a aac -b:a "$AUDIO_BITRATE" -y "$mp4_file" > /dev/null 2>&1
fi
# 检查转换结果
if [[ $? -eq 0 && -f "$mp4_file" ]]; then
echo -e "${GREEN}$wmv_file 转换成功!输出:$mp4_file${NC}"
total_success=$((total_success + 1))
else
echo -e "${RED}$wmv_file 转换失败!${NC}"
total_failed=$((total_failed + 1))
failed_files+=("$wmv_file")
# 删除转换失败的残缺文件
[[ -f "$mp4_file" ]] && rm -f "$mp4_file"
fi
echo -e "${GREEN}-------------------------------------${NC}"
done
# -------------------------- 步骤5:转换总结 --------------------------
echo -e "${GREEN}=====================================${NC}"
echo -e "${GREEN}批量转换完成!${NC}"
echo -e "${GREEN}✅ 成功转换:$total_success 个文件${NC}"
echo -e "${RED}❌ 转换失败:$total_failed 个文件${NC}"
if [[ ${#failed_files[@]} -gt 0 ]]; then
echo -e "${RED}失败文件列表:${NC}"
for file in "${failed_files[@]}"; do
echo " - $file"
done
fi
echo -e "${GREEN}=====================================${NC}"
echo -e "${YELLOW}提示:转换后的MP4文件可直接在NAS上流畅播放(硬件解码支持)${NC}"