字幕ファイルには、.srtから.sub、.assなど、さまざまな形式があります。メディアファイルと一緒に字幕ファイルを検索するようにmpvに指示する方法はありますか?現在、私はファイル名によってはかなり長くなることがあるこのようなことをしなければなりません-
[$] mpv --list-options | grep sub-file
(null) requires an argument
--sub-file String list (default: ) [file]
回答をお待ちしております。
Update 1-.srt(または下付き文字)を含む典型的な映画
[$] mpv Winter.Sleep.\(Kis.Uykusu\).2014.720p.BrRip.2CH.x265.HEVC.Megablast.mkv
(null) requires an argument
Playing: Winter.Sleep.(Kis.Uykusu).2014.720p.BrRip.2CH.x265.HEVC.Megablast.mkv
(+) Video --vid=1 (*) (hevc)
(+) Audio --aid=1 (aac)
(+) Subs --sid=1 'Winter.Sleep.(Kis.Uykusu).2014.720p.BrRip.2CH.x265.HEVC.Megablast.srt' (subrip) (external)
[vo/opengl] Could not create EGL context!
[sub] Using subtitle charset: UTF-8-BROKEN
AO: [alsa] 48000Hz stereo 2ch float
VO: [opengl] 1280x536 yuv420p
AV: 00:02:14 / 03:16:45 (1%) A-V: 0.000
最も興味深い行はこれです:-
(+) Subs --sid=1 'Winter.Sleep.(Kis.Uykusu).2014.720p.BrRip.2CH.x265.HEVC.Megablast.srt' (subrip) (external)
ファイルが同じファイル名の.assまたは.subである場合、動作しません。私はそれらの拡張子を持つ多くのメディアファイルでそれを試しました、そして毎回mpvがビデオとオーディオとプロトコルをロードしますが、外部字幕ファイルはロードしません。
アップデート2-.assスクリプト部分は、mpvのbtsにバグとしてリストされています- https://github.com/mpv-player/mpv/issues/2846
アップデート3-アップストリームの助けを借りてデバッグを試みており、そのために https://github.com/mpv-player/mpv/issues/3091 に提出されています.
責任があるのはmpvではなく、字幕をデコードすることになっているffmpeg(およびlibavformat)のようです。したがって、それにffmpegも追加しました。
man mpv
にあるように:
--sub-auto=<no|exact|fuzzy|all>, --no-sub-auto
Load additional subtitle files matching the video filename. The
parameter specifies how external subtitle files are matched.
exact is enabled by default.
no Don't automatically load external subtitle files.
exact Load the media filename with subtitle file extension
(default).
fuzzy Load all subs containing media filename.
all Load all subs in the current and --sub-paths directories.
exact
は適切な選択のように見えますが、これはデフォルトであり、[video name minus extension].srt
のようなファイルをロードしないため、fuzzy
が次善策であり、私のシステムで機能します。
つまり、echo "sub-auto=fuzzy" >> ~/.config/mpv/mpv.conf
だけです。
私は単純な関数を使用します:
mpvs() {
local file="$1"
mpv --sub-file="${file%.*}".srt "$file"
}
拡張子が異なる字幕ファイルの存在をテストする場合は、より複雑な方法を使用できます。
#!/usr/bin/env bash
# Play subtitles for a film if they exist
movie="$1"
mdir="${movie%/*}"
name="${movie##*/}"
cd "$mdir"
for file in *; do
if [[ ${file%.*} == ${name%.*} ]]; then
title="${file%.*}"
for match in "$title"*; do
if [[ $match =~ @*.(ass|srt|sub) ]]; then
subtitles="$match"
fi
done
fi
done
if [[ -n $subtitles ]]; then
mpv --subfile="$subtitles" "$name"
else
printf "%s\n" "No subs found, playing film anyway..."
mpv "$name"
fi
# vim:set sw=2 ts=2 et:
このようなものを作成したい場合(mpvに関連付けられているファイルをクリックして、字幕を再生します)
内部/usr/share/applications/mpv.desktop
:
...
Exec=/home/username/custom_apps/mpv2.sh %F
...
その後、mpv2.sh
脚本:
#!/usr/bin/env bash
subtitles=""
movie="$1"
mdir="${movie%/*}"
name="${movie##*/}"
dir="$(readlink -f "$1")"
mdir="${dir1%/*}"
for file in $mdir/*; do
if [[ ${file%.*} == ${1%.*} ]]; then
title="${file%.*}"
for match in "$title"*; do
if [[ $match =~ @*.(vtt|ass|srt|sub) ]]; then
subtitles="$match"
fi
done
fi
done
if [[ -n $subtitles ]]; then
mpv "$mdir1" --sub-file="$subtitles"
else
mpv "$name"
fi