#!/bin/bash

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

# 输入和输出目录
INPUT_DIR="./"  # 默认当前目录
OUTPUT_DIR="./output"  # 输出目录

# 创建输出目录(如果不存在)
mkdir -p "$OUTPUT_DIR"

# 遍历当前目录下的所有 .mkv 文件
for video in *.mkv; do
    # 获取不带扩展名的文件名
    basename="${video%.mkv}"
    
    # 找到对应的 SRT 文件
    subtitle="${basename}.srt"

    if [[ -f "$subtitle" ]]; then
        echo "正在处理视频: $video 和字幕: $subtitle"
        
        # 输出文件路径
        output_file="$OUTPUT_DIR/${basename}_embedded.mkv"

        # 调用 FFmpeg 内嵌软字幕
        ffmpeg -i "$video" -i "$subtitle" -c copy -c:s srt "$output_file" -y

        if [[ $? -eq 0 ]]; then
            echo "已生成文件: $output_file"

            # 删除原始视频和字幕文件
            rm -f "$video" "$subtitle"
            echo "已删除原始文件: $video 和 $subtitle"
        else
            echo "处理 $video 时出错,保留原文件。"
        fi
    else
        echo "未找到对应的字幕文件: $subtitle,跳过 $video"
    fi
done

echo "处理完成!所有文件已输出到 $OUTPUT_DIR"

如果需要改成硬字幕(Hardsub)
硬字幕会将字幕渲染到视频画面中,字幕成为视频的一部分,无法关闭。只需要在脚本中改动 ffmpeg 命令即可:

将这一行:

ffmpeg -i "$video" -i "$subtitle" -c copy -c:s srt "$output_file" -y

替换为:

ffmpeg -i "$video" -vf subtitles="$subtitle" -c:a copy "$output_file" -y

具体改动:
添加 -vf subtitles:
-vf subtitles="$subtitle" 使用字幕过滤器,将字幕直接渲染到视频画面中。
移除 -c:s srt:
硬字幕不需要额外的字幕轨道,因此可以省略 -c:s 参数。