- 提取音轨
ffmpeg -i 00001.m2ts -c:a pcm_s24le ~/audio01.wav
- 压缩flac
seq -w 01 12 | parallel -j 12 ffmpeg -i "audio{}.wav" -c:a flac -sample_fmt s32 -compression_level 12 "output{}.flac"
- 合并视频,音频
for i in {01..12}; do
mkvmerge -o "final_output$i.mkv" --language 0:ja "video$i.mkv" "output$i.flac"
done
- 创建文件夹结构
#!/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
- 合并文件
#!/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 "所有操作已完成。"
- 把视频拷出来
mkdir -p result
find E* -name "final_output*.mkv" -exec cp {} result/ \;