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

更新 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

相关内容