Odtwarzaj napisy automatycznie za pomocą MPV

13

Pliki napisów są w różnych formatach, od .srt do .sub do .ass i tak dalej. Czy istnieje sposób, aby powiedzieć mpv, aby szukał plików napisów wraz z plikami multimedialnymi i jeśli tak, aby automatycznie rozpocząć odtwarzanie pliku. Obecnie muszę zrobić coś takiego, co może być dość długie w zależności od nazwy pliku -

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

Czekamy na odpowiedzi.

Aktualizacja 1 - Typowy film z rozszerzeniem .srt (lub indeksem dolnym)

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

Najciekawsza linia to: -

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

Teraz, jeśli plik byłby .ass lub .sub o tej samej nazwie, nie działałby. Próbowałem tego w wielu plikach multimedialnych, które mają te rozszerzenia i za każdym razem mpv ładuje wideo i audio oraz protokoły, ale nie zewnętrzne pliki napisów.

Aktualizacja 2 - Część skryptu .ass jest wymieniona jako błąd w bts mpv - https://github.com/mpv-player/mpv/issues/2846

Aktualizacja 3 - Próbowałem debugować za pomocą upstream, złożony https://github.com/mpv-player/mpv/issues/3091 .

Wydaje się jednak, że to nie mpv jest odpowiedzialne, ale ffmpeg (i libavformat), który ma dekodować napisy. Dlatego też dodałem do niego ffmpeg.

shirish
źródło
Jeśli plik napisów ma dokładnie taką samą nazwę jak plik multimedialny (oczywiście poza indeksem dolnym), mpv użyje go automatycznie, tak myślę.
Faheem Mitha
Tak nie jest. Z wyjątkiem .srt nie wie o innych. Dzieje się tak na 0.14 dunno, jeśli zostało to naprawione w 0.15, 0.16 lub 0.17 trzech ostatnich wydaniach, które nie są jeszcze w Debianie.
shirish
O. Tak, zawsze używam srt. Możesz zgłosić problem.
Faheem Mitha
Zbudowanie pakietu Debiana powinno być dość łatwe do 0.17użycia 0.14. 0.14Opakowanie posiada 4 łatki przed Upstream, ale przeważnie wyglądają dość trywialne.
Faheem Mitha

Odpowiedzi:

15

Jak widać w 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.

exactwydaje się być właściwym wyborem, ale ponieważ jest to domyślny i nie ładuje plików [video name minus extension].srt, fuzzyjest kolejnym najlepszym wyborem i działa w moim systemie.

Tak po prostu echo "sub-auto=fuzzy" >> ~/.config/mpv/mpv.conf.

Dominykas Mostauskis
źródło
2

Używam prostej funkcji:

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

Jeśli chcesz sprawdzić obecność plików napisów z różnymi rozszerzeniami, możesz zastosować bardziej złożone podejście:

#!/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
źródło
jasonwryan, wolę zachować prostotę i mam nadzieję, że w pliku .config. Zaktualizowałem również moje pytanie o więcej informacji.
shirish
@shirish Nie wyobrażam sobie nic prostszego; a jeśli chcesz to w pliku konfiguracyjnym, musisz otworzyć żądanie funkcji.
jasonwryan
0

jeśli chcesz stworzyć coś takiego (kliknij dowolny plik związany z mpv i zagraj z napisami)

wewnątrz /usr/share/applications/mpv.desktop:

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

następnie w mpv2.shskrypcie:

#!/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
użytkownik3824954
źródło