Lire les sous-titres automatiquement avec mpv

13

Les fichiers de sous-titres sont disponibles dans une variété de formats, de .srt à .sub à .ass et ainsi de suite et ainsi de suite. Existe-t-il un moyen de dire à mpv de rechercher des fichiers de sous-titres en même temps que les fichiers multimédias et s'il le fait pour commencer à lire le fichier automatiquement. Actuellement, je dois faire quelque chose comme ça qui peut être assez long en fonction du nom de fichier -

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

Réjouissez-vous des réponses.

Mise à jour 1 - Un film typique qui a .srt (ou indice)

[$] 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 ligne la plus intéressante est la suivante: -

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

Maintenant, si le fichier était au format .ass ou .sub avec le même nom de fichier, cela ne fonctionnerait pas. Je l'ai essayé dans de nombreux fichiers multimédias qui ont ces extensions et à chaque fois que mpv charge la vidéo et l'audio et les protocoles mais pas les fichiers de sous-titres externes.

Mise à jour 2 - La partie de script .ass est répertoriée comme bogue dans les bts de mpv - https://github.com/mpv-player/mpv/issues/2846

Mise à jour 3 - J'ai essayé de déboguer avec l'aide de l'amont, déposé https://github.com/mpv-player/mpv/issues/3091 pour cela.

Il semble cependant que ce n'est pas mpv qui est responsable mais ffmpeg (et libavformat) qui est censé décoder les sous-titres. C'est pourquoi nous y avons également ajouté ffmpeg.

shirish
la source
Si le fichier de sous-titres a exactement le même nom que le fichier multimédia (en dehors de l'indice, bien sûr), mpv l'utilisera automatiquement, je pense.
Faheem Mitha
Ce n'est pas le cas. Sauf pour .srt, il ne connaît pas les autres. C'est sur 0.14 dunno si cela a été corrigé dans 0.15, 0.16 ou 0.17 les trois dernières versions qui ne sont pas encore dans Debian.
shirish
Oh. Oui, j'utilise toujours srt. Vous pouvez déposer un problème à ce sujet.
Faheem Mitha
Il devrait être assez facile de construire un paquet Debian pour 0.17utiliser l' 0.14emballage. L' 0.14emballage a 4 correctifs contre en amont, mais ils semblent pour la plupart assez banals.
Faheem Mitha

Réponses:

15

Comme vu dans 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.

exactsemblerait être le choix approprié, mais comme c'est la valeur par défaut et qu'il ne charge pas les fichiers comme [video name minus extension].srt, fuzzyc'est le meilleur pari suivant et cela fonctionne sur mon système.

Si juste echo "sub-auto=fuzzy" >> ~/.config/mpv/mpv.conf.

Dominykas Mostauskis
la source
2

J'utilise une fonction simple:

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

Si vous souhaitez tester la présence de fichiers de sous-titres avec différentes extensions, vous pouvez utiliser une approche plus complexe:

#!/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
la source
jasonwryan, je préfère rester simple et, espérons-le, dans le fichier .config. J'ai également mis à jour ma question avec plus d'informations.
shirish
@shirish Je ne peux rien imaginer de plus simple; et si vous le souhaitez dans le fichier de configuration, vous devrez ouvrir une demande de fonctionnalité.
jasonwryan
0

si vous voulez créer quelque chose comme ça, (cliquez sur n'importe quel fichier associé à mpv et jouez avec des sous-titres)

à l'intérieur /usr/share/applications/mpv.desktop:

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

puis à l'intérieur du mpv2.shscript:

#!/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
la source