web-dev-qa-db-ja.com

mpvで自動的に字幕を再生する

字幕ファイルには、.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も追加しました。

13
shirish

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だけです。

15

私は単純な関数を使用します:

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:
2
jasonwryan

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