web-dev-qa-db-fra.com

Lire les sous-titres automatiquement avec MPV

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 le long des fichiers multimédia et s'il doit commencer à lire automatiquement le fichier. Actuellement je dois faire quelque chose comme ça, ce 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]

Attendons avec impatience les 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 comme .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 un bogue au BTS de MPV - - https://github.com/mpv-player/mpv/issues/2846

Mise à jour 3 - essayait de déboguer avec l'aide d'en amont, classée https://github.com/mpv-player/mpv/issues/3091 pour cela.

Il semble que ce ne soit pas MPV qui est responsable mais FFMPEG (et LibavAformat) qui est censé décoder les sous-titres. J'ai donc ajouté FFMPEG à cela aussi.

13
shirish

Comme on le voit 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.

exact semble être le choix approprié, mais comme c'est la valeur par défaut et que cela ne charge pas de fichiers comme [video name minus extension].srt, fuzzy est le prochain meilleur pari et cela fonctionne sur mon système.

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

15

si vous souhaitez créer quelque chose comme ceci, (cliquez sur n'importe quel fichier associé à MPV et à jouer avec les sous-titres)

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

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

puis à l'intérieur de mpv2.sh script:

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