Reproduce subtítulos automáticamente con mpv

13

Los archivos de subtítulos vienen en una variedad de formatos, desde .srt a .sub a .ass y así sucesivamente. ¿Hay alguna manera de decirle a mpv que busque archivos de subtítulos junto con los archivos multimedia y si lo hace para comenzar a reproducir el archivo automáticamente? Actualmente tengo que hacer algo como esto, que puede ser bastante largo dependiendo del nombre del archivo:

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

Esperamos respuestas.

Actualización 1: una película típica que tiene .srt (o subíndice)

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

La línea más interesante es esta: -

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

Ahora, si el archivo fuera como .ass o .sub con el mismo nombre de archivo, no funcionaría. Lo he probado en muchos archivos multimedia que tienen esas extensiones y cada vez que mpv carga el video y el audio y los protocolos, pero no los archivos de subtítulos externos.

Actualización 2: la parte del script .ass aparece como un error en bts de mpv - https://github.com/mpv-player/mpv/issues/2846

Actualización 3: he estado intentando depurar con la ayuda de upstream, archivé https://github.com/mpv-player/mpv/issues/3091 para eso.

Sin embargo, parece que no es mpv el responsable, sino ffmpeg (y libavformat) que se supone que decodifica los subtítulos. Por lo tanto, también le agregué ffmpeg.

shirish
fuente
Si el archivo de subtítulos tiene exactamente el mismo nombre que el archivo multimedia (aparte del subíndice, por supuesto), creo que mpv lo usará automáticamente.
Faheem Mitha
No lo hace. Excepto por .srt, no sabe de otros. Esto está en 0.14 dunno si se ha solucionado en 0.15, 0.16 o 0.17 las últimas tres versiones que aún no están en Debian.
Shirish
Oh. Sí, siempre lo uso srt. Podría presentar un problema al respecto.
Faheem Mitha
Debería ser bastante fácil crear un paquete Debian para 0.17usar el 0.14paquete. El 0.14paquete tiene 4 parches contra la corriente arriba, pero en su mayoría se ven bastante triviales.
Faheem Mitha

Respuestas:

15

Como se ve en 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.

exactparece la opción adecuada, pero como es la opción predeterminada y no carga archivos como [video name minus extension].srt, fuzzyes la siguiente mejor opción y funciona en mi sistema.

Por lo que sólo echo "sub-auto=fuzzy" >> ~/.config/mpv/mpv.conf.

Dominykas Mostauskis
fuente
2

Yo uso una función simple:

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

Si desea probar la presencia de archivos de subtítulos con diferentes extensiones, podría usar un enfoque más complejo:

#!/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
fuente
jasonwryan, preferiría mantenerlo simple y con suerte en el archivo .config. También he actualizado mi pregunta con más información.
Shirish
@shirish No puedo imaginar nada más simple; y si lo desea en el archivo de configuración, deberá abrir una solicitud de función.
jasonwryan
0

si desea crear algo como esto (haga clic en cualquier archivo asociado a mpv y juegue con subtítulos)

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

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

luego dentro del mpv2.shguión:

#!/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
usuario3824954
fuente