Reproduzir legendas automaticamente com mpv

8

Os arquivos de legendas vêm em vários formatos, de .srt a .sub a .ass e assim por diante. Existe uma maneira de dizer ao mpv para procurar por arquivos de legendas junto com os arquivos de mídia e, se isso acontecer, começar a reproduzir o arquivo automaticamente. Atualmente eu tenho que fazer algo assim, que pode ser muito longo, dependendo do nome do arquivo -

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

Aguarde as respostas.

Atualização 1 - Um filme típico que possui .srt (ou subscrito)

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

A linha mais interessante é esta: -

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

Agora, se o arquivo fosse como .ass ou .sub com o mesmo nome de arquivo, não funcionaria. Eu tentei isso em muitos arquivos de mídia que possuem essas extensões e cada vez que o mpv carrega o vídeo e o áudio e os protocolos, mas não os arquivos de legenda externos.

Atualização 2 - A parte do script .ass é listada como um bug no bts do mpv - link

Atualização 3 - Tente depurar com ajuda do upstream, arquivado link para isso.

Parece, entretanto, que não é o mpv que é responsável, mas o ffmpeg (e o libavformat), que supostamente decodifica as legendas. Daí ter adicionado ffmpeg para isso também.

    
por shirish 29.04.2016 / 01:22

3 respostas

11

Como pode ser visto em 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 parece ser a escolha apropriada, mas como é o padrão e não carrega arquivos como [video name minus extension].srt , fuzzy é a próxima melhor aposta e funciona no meu sistema.

Então, apenas echo "sub-auto=fuzzy" >> ~/.config/mpv/mpv.conf .

    
por 28.06.2016 / 16:43
3

Eu uso uma função simples:

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

Se você quiser testar a presença de arquivos de legendas com extensões diferentes, use uma abordagem mais complexa:

#!/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:
    
por 29.04.2016 / 01:38
0

se você quiser criar algo assim, (clique em qualquer arquivo associado ao mpv e brinque com legendas)

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

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

e, em seguida, dentro do script mpv2.sh :

#!/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
    
por 16.08.2018 / 09:30