1. 提取音轨
ffmpeg -i 00001.m2ts -c:a pcm_s24le ~/audio01.wav
  1. 压缩flac
seq -w 01 12 | parallel -j 12 ffmpeg -i "audio{}.wav" -c:a flac -sample_fmt s32 -compression_level 12 "output{}.flac"
  1. 合并视频,音频
for i in {01..12}; do
  mkvmerge -o "final_output$i.mkv" --language 0:ja "video$i.mkv" "output$i.flac"
done
  1. 创建文件夹结构
#!/bin/bash

# 遍历 01 到 12 的数字
for i in {01..12}; do
    # 创建对应的 E01 到 E12 文件夹
    dir="E$i"
    mkdir -p "$dir"
    
    # 匹配规则:确保数字前后都不是其他数字
    # 匹配包含相应编号的 .mkv 文件,并确保编号前后不是数字
    mv *[^0-9]"$i"[^0-9]*.mkv "$dir"/ 2>/dev/null
    mv *[^0-9]"$i".mkv "$dir"/ 2>/dev/null  # 处理编号在文件末尾的情况

    # 移动 subtitles 文件夹中包含相应编号的 .ass 文件,确保编号前后不是数字
    mv subtitles/*[^0-9]"$i"[^0-9]*.ass "$dir"/ 2>/dev/null
    mv subtitles/*[^0-9]"$i".ass "$dir"/ 2>/dev/null  # 处理编号在文件末尾的情况

    # 移动 chapters 文件夹中包含相应编号的 .txt 文件,确保编号前后不是数字
    mv chapters/*[^0-9]"$i"[^0-9]*.txt "$dir"/ 2>/dev/null
    mv chapters/*[^0-9]"$i".txt "$dir"/ 2>/dev/null  # 处理编号在文件末尾的情况
done
  1. 合并文件
#!/bin/bash

# 检查依赖工具是否安装
if ! command -v mkvextract &> /dev/null; then
    echo "错误:mkvextract 未安装,请安装后重试。"
    exit 1
fi

if ! command -v mkvmerge &> /dev/null; then
    echo "错误:mkvmerge 未安装,请安装后重试。"
    exit 1
fi

# 定义要处理的文件夹列表
folders=$(find . -maxdepth 1 -type d -name 'E[0-9][0-9]')

if [ -z "$folders" ]; then
    echo "错误:当前目录下没有 E01-E12 文件夹。"
    exit 1
fi

# 遍历每个 Exx 文件夹
for dir in $folders; do
    echo "检查文件夹 $dir ..."

    # 检查文件和文件夹数量
    mkv_count=$(find "$dir" -maxdepth 1 -type f -name '*.mkv' | wc -l)
    ass_count=$(find "$dir" -maxdepth 1 -type f -name '*.ass' | wc -l)
    txt_count=$(find "$dir" -maxdepth 1 -type f -name '*.txt' | wc -l)
    fonts_dir="$dir/subsetted_fonts"

    if [ ! -d "$fonts_dir" ]; then
        fonts_count=0
    else
        fonts_count=1
    fi

    if [ $mkv_count -ne 1 ] || [ $ass_count -ne 2 ] || [ $txt_count -ne 1 ] || [ $fonts_count -ne 1 ]; then
        echo "错误:文件夹 $dir 内文件结构不符合要求。"
        exit 1
    fi

    # 获取文件名
    mkv_file=$(find "$dir" -maxdepth 1 -type f -name '*.mkv')
    txt_file=$(find "$dir" -maxdepth 1 -type f -name '*.txt')
    chs_ass=$(find "$dir" -maxdepth 1 -type f -name '*chs_jpn*.ass')
    cht_ass=$(find "$dir" -maxdepth 1 -type f -name '*cht_jpn*.ass')

    # 检查字幕文件是否存在
    if [ -z "$chs_ass" ] || [ -z "$cht_ass" ]; then
        echo "错误:文件夹 $dir 缺少必要的字幕文件。"
        exit 1
    fi

    # 提取视频和音频流的信息
    echo "正在处理文件夹 $dir ..."

    # 创建提取目录
    extract_dir="$dir/extract_temp"
    mkdir -p "$extract_dir"

    # 提取视频和音频轨道
    mkvextract tracks "$mkv_file" 0:"$extract_dir/video.hevc" 1:"$extract_dir/audio.flac"

    if [ $? -ne 0 ]; then
        echo "错误:提取视频或音频失败。"
        exit 1
    fi

    # 删除原始 mkv 文件
    rm "$mkv_file"

    # 检查 subsetted_fonts 文件夹内的字体文件
    font_files=()
    while IFS= read -r -d '' font; do
        font_files+=("$font")
    done < <(find "$fonts_dir" -type f -print0)

    if [ ${#font_files[@]} -eq 0 ]; then
        echo "错误:文件夹 $dir 的 subsetted_fonts 文件夹内没有找到任何字体文件。"
        exit 1
    fi

    # 准备附件参数
    attachments=()
    for font in "${font_files[@]}"; do
        # 根据文件扩展名设置 MIME 类型
        extension="${font##*.}"
        case "$extension" in
            ttf)
                mime_type="font/ttf"
                ;;
            otf)
                mime_type="font/otf"
                ;;
            *)
                echo "警告:未识别的字体文件类型 $font,跳过。"
                continue
                ;;
        esac
        attachments+=(--attachment-mime-type "$mime_type" --attach-file "$font")
    done

    # 合并新的 mkv 文件
    mkvmerge -o "$dir/new_$(basename "$mkv_file")" \
        --language 0:und "$extract_dir/video.hevc" \
        --language 0:ja "$extract_dir/audio.flac" \
        --language 0:zh-ch --track-name 0:"简日双语" --default-track 0:yes "$chs_ass" \
        --language 0:zh-tw --track-name 0:"繁日双语" --default-track 0:no "$cht_ass" \
        --chapters "$txt_file" \
        "${attachments[@]}"

    if [ $? -ne 0 ]; then
        echo "错误:合并 MKV 文件失败。"
        exit 1
    fi

    # 删除提取的临时文件
    rm -r "$extract_dir"

    # 重命名新文件为原始文件名
    mv "$dir/new_$(basename "$mkv_file")" "$mkv_file"

    echo "文件夹 $dir 处理完成。"

done

echo "所有操作已完成。"
  1. 把视频拷出来
mkdir -p result
find E* -name "final_output*.mkv" -exec cp {} result/ \;