#!/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}"