Spielen Sie Untertitel automatisch mit mpv

12

Untertiteldateien gibt es in verschiedenen Formaten, von .srt über .sub bis .ass und so weiter und so fort. Gibt es eine Möglichkeit, mpv anzuweisen, zusammen mit den Mediendateien nach Untertiteldateien zu suchen und die Datei automatisch abzuspielen? Momentan muss ich so etwas machen, was je nach Dateiname ziemlich lang sein kann -

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

Freuen Sie sich auf Antworten.

Update 1 - Ein typischer Film mit .srt (oder Index)

[$] 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

Die interessanteste Zeile lautet: -

(+) Subs  --sid=1 'Winter.Sleep.(Kis.Uykusu).2014.720p.BrRip.2CH.x265.HEVC.Megablast.srt' (subrip) (external)

Wenn die Datei nun .ass oder .sub mit demselben Dateinamen wäre, würde sie nicht funktionieren. Ich habe es in vielen Mediendateien versucht, die diese Erweiterungen haben, und jedes Mal, wenn mpv das Video und Audio und die Protokolle lädt, aber nicht die externen Untertiteldateien.

Update 2 - Der .ass-Skriptteil wird als Fehler bei mpvs bts aufgeführt - https://github.com/mpv-player/mpv/issues/2846

Update 3 - Habe versucht, mit Hilfe von Upstream zu debuggen, dafür https://github.com/mpv-player/mpv/issues/3091 .

Es scheint jedoch, dass nicht mpv verantwortlich ist, sondern ffmpeg (und libavformat) die Untertitel entschlüsseln sollen. Daher habe ich auch ffmpeg hinzugefügt.

shirish
quelle
Wenn die Untertiteldatei genau den gleichen Namen wie die Mediendatei hat (abgesehen vom Index natürlich), wird sie von mpv automatisch verwendet, denke ich.
Faheem Mitha
Das tut es nicht. Mit Ausnahme von .srt weiß es nichts über andere. Dies ist auf 0.14 keine Ahnung, ob dies in 0.15, 0.16 oder 0.17 der letzten drei Releases behoben wurde, die noch nicht in Debian sind.
Shirish
Oh. Ja, ich benutze immer srt. Sie könnten ein Problem damit einreichen.
Faheem Mitha
Es sollte ziemlich einfach sein, ein Debian-Paket für die 0.17Verwendung der 0.14Verpackung zu erstellen . Die 0.14Verpackung hat 4 Patches gegen Upstream, aber sie sehen meistens ziemlich trivial aus.
Faheem Mitha

Antworten:

14

Wie zu sehen in 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.

exactscheint die richtige Wahl zu sein, aber da dies die Standardeinstellung ist und keine Dateien wie geladen werden [video name minus extension].srt, fuzzyist dies die nächstbeste Wahl und funktioniert auf meinem System.

Also einfach echo "sub-auto=fuzzy" >> ~/.config/mpv/mpv.conf.

Dominykas Mostauskis
quelle
2

Ich benutze eine einfache Funktion:

mpvs() {
   local file="$1"
   mpv --sub-file="${file%.*}".srt "$file"
}

Wenn Sie das Vorhandensein von Untertiteldateien mit unterschiedlichen Erweiterungen testen möchten, können Sie einen komplexeren Ansatz verwenden:

#!/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
quelle
jasonwryan, ich würde es vorziehen, es einfach und hoffentlich in der .config-Datei zu halten. Ich habe meine Frage auch mit weiteren Informationen aktualisiert.
Shirish
@ Shirish Ich kann mir nichts Einfacheres vorstellen. und wenn Sie es in der Konfigurationsdatei möchten, müssen Sie eine Funktionsanforderung öffnen.
Jasonwryan
0

Wenn Sie so etwas erstellen möchten (klicken Sie auf eine Datei, die mit mpv verknüpft ist, und spielen Sie mit Untertiteln).

innen /usr/share/applications/mpv.desktop:

     ...
     Exec=/home/username/custom_apps/mpv2.sh %F
     ...

dann im mpv2.shSkript:

#!/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
user3824954
quelle