mpvは自動的に字幕を再生します

mpvは自動的に字幕を再生します

字幕ファイルは、.srt、.sub、.assなど、さまざまな形式で提供されます。 mpvに字幕ファイルとメディアファイルを検索し、そのファイルが見つかったら自動的に再生を開始するように指示する方法はありますか?現在、私はこのようなことをする必要がありますが、ファイル名によってはかなり長くなることがあります。

[$] mpv --list-options | grep sub-file                                                                                              
(null) requires an argument
 --sub-file                       String list (default: ) [file]

答えを楽しみにしています。

アップデート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

Update 3 - アップストリームの助けを借りてデバッグを試み、コミットしました。https://github.com/mpv-player/mpv/issues/3091そのような理由で。

mpvではなく字幕デコードを担当するffmpeg(およびlibavformat)のようです。だからffmpegも追加されました。

答え1

見たように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].srtfuzzyのシステムで動作します。

だからちょうどecho "sub-auto=fuzzy" >> ~/.config/mpv/mpv.conf

答え2

私は単純な機能を使用します:

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:

答え3

似たようなものを作成したい場合(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

関連情報