Files

如何使用 shell 循環從 mkv 中刪除任意字幕格式

  • August 3, 2019

我製作了這個腳本來從給定路徑中的所有 mkv 文件中刪除所有 subs。它工作正常。但現在我只想刪除 PGS 字幕並保留所有 SRT 文件,無論語言如何。

for file in "$@"*mkv; do
   mkvmerge -o "${file%.mkv}".nosubs.mkv --no-subtitles "$file"
done

獎勵:如何保留任意語言的所有 SRT 文件。

中的-I選項mkvmerge已被刪除並替換為-J輸出 JSON。這是適用於使用的lumato 腳本jq(需要安裝,請參閱此連結以獲取作業系統的安裝說明)

#!/bin/bash
# If no directory is given, work in local dir
if [ -d "$1" ] || [ -f "$1" ]; then
 DIR="$1"
else
 echo "No target path given, using working directory '$(pwd)'"
 DIR="." 
fi

# Get all the MKV files in this dir and its subdirs
find "$DIR" -type f -name '*.mkv' | while read filename
do
   subs=$(mkvmerge -J "$filename" | jq -r '.tracks[] | select(.type=="subtitles") | select(.properties.language=="eng").id' | sed 'N;s/\n/,/') 
   if [[ -n $subs ]]
   then
        subs="-s $subs"
   else
       subs=-S
   fi
   echo -e "Extracting tracks \e[1m\e[34m${subs#* }\e[0m from \e[1m\e[34m${filename}\e[0m..."
   mkvmerge $subs -o "${filename%.mkv}".eng-srt-only.mkv "$filename" > /dev/null 2>&1
done

解析 的輸出以獲取所需的軌道 ID,並使用( ) 選項mkvmerge -I將結果作為逗號分隔的列表傳遞。--subtitle-tracks``-s

要僅選擇 SRT 字幕,請使用sed

for file in "$@"*.mkv; do
   subs=$(mkvmerge -I "$file" | sed -ne '/^Track ID [0-9]*: subtitles (SubRip\/SRT).*/ { s/^[^0-9]*\([0-9]*\):.*/\1/;H }; $ { g;s/[^0-9]/,/g;s/^,//;p }')
   if [[ -n $subs ]]; then subs="-s $subs"; else subs=-S; fi
   mkvmerge $subs -o "${file%.mkv}".srt-only.mkv "$file"
done

同樣,要僅選擇英語 SRT:

for file in "$@"*.mkv; do
   subs=$(mkvmerge -I "$file" | sed -ne '/^Track ID [0-9]*: subtitles (SubRip\/SRT).* language:eng.*/ { s/^[^0-9]*\([0-9]*\):.*/\1/;H }; $ { g;s/[^0-9]/,/g;s/^,//;p }')
   if [[ -n $subs ]]; then subs="-s $subs"; else subs=-S; fi
   mkvmerge $subs -o "${file%.mkv}".eng-srt-only.mkv "$file"
done

更改language:eng以選擇另一種語言。

引用自:https://unix.stackexchange.com/questions/411526