用mpv自动播放字幕


13

字幕文件有多种格式,从.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。


我认为,如果字幕文件的名称与媒体文件的名称完全相同(当然,除了下标),mpv会自动使用它。
Faheem Mitha 2016年

没有。除了.srt外,它不了解其他人。如果已在0.15、0.16或0.17中修复了此问题,则为0.14 dunno,这在Debian中尚未发行,后三个版本已被修复。
shirish '16

哦。是的,我经常使用srt。您可以提出一个问题。
Faheem Mitha

构建一个0.17使用该软件包的Debian软件包应该相当容易0.14。该0.14包装有4个补丁针对上游,但他们大多看起来相当微不足道。
Faheem Mitha

Answers:


15

如图所示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:

jasonwryan,我希望保留它的简单性,并希望将其保存在.config文件中。我还用更多信息更新了我的问题。
shirish

@shirish我简直无法想象;并且如果您想在配置文件中使用它,则需要打开功能请求。
jasonwryan '16

0

如果您要创建类似的内容,(单击与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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.