From ab5ca94f172d41f0302fc4734425be7134853160 Mon Sep 17 00:00:00 2001 From: sophon Date: Fri, 26 Dec 2025 11:16:38 +0800 Subject: [PATCH] modify scripts --- docker/stash/scripts/wmv2mp4_batch.sh | 112 ++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 docker/stash/scripts/wmv2mp4_batch.sh diff --git a/docker/stash/scripts/wmv2mp4_batch.sh b/docker/stash/scripts/wmv2mp4_batch.sh new file mode 100644 index 0000000..80563a1 --- /dev/null +++ b/docker/stash/scripts/wmv2mp4_batch.sh @@ -0,0 +1,112 @@ +#!/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}" \ No newline at end of file