112 lines
5.2 KiB
Bash
112 lines
5.2 KiB
Bash
#!/bin/bash
|
||
# 功能:智能WMV批量转MP4脚本(自动检测硬件编码,适配低性能NAS)
|
||
# 特性:1. 自动检测QSV/NVENC硬件编码;2. 支持自定义画质/线程;3. 跳过已转换文件;4. 后台执行友好
|
||
# 使用方法:1. 赋予执行权限 chmod +x wmv2mp4_batch.sh;2. 放到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}" |