Reproduza legendas automaticamente com mpv

13

Os arquivos de legenda são fornecidos em diversos formatos, de .srt a .sub a .ass e assim por diante. Existe uma maneira de dizer ao MPV para procurar arquivos de legenda junto com os arquivos de mídia e se isso acontecer para começar a reproduzir o arquivo automaticamente. Atualmente, tenho que fazer algo assim, que pode ser bastante longo, dependendo do nome do arquivo -

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

Ansioso por 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 em muitos arquivos de mídia que possuem essas extensões e cada vez que o mpv carrega o vídeo, o áudio e os protocolos, mas não os arquivos de legenda externos.

Atualização 2 - A parte do script .ass está listada como um bug nos bts do mpv - https://github.com/mpv-player/mpv/issues/2846

Atualização 3 - Tentei depurar com a ajuda do upstream, arquivado https://github.com/mpv-player/mpv/issues/3091 para isso.

Parece que não é o mpv o responsável, mas o ffmpeg (e o libavformat) que deve decodificar as legendas. Portanto, adicionamos o ffmpeg a ele também.

shirish
fonte
Se o arquivo de legenda tiver exatamente o mesmo nome que o arquivo de mídia (além do subscrito, é claro), o mpv o usará automaticamente, eu acho.
Faheem Mitha 29/04
Não faz. Exceto por .srt, ele não conhece os outros. Isso está em 0,14 não, se isso foi corrigido em 0,15, 0,16 ou 0,17 nos últimos três lançamentos que ainda não estão no Debian.
Shirish
Oh Sim, eu sempre uso srt. Você pode registrar um problema sobre isso.
Faheem Mitha
Deve ser bastante fácil criar um pacote Debian para 0.17usar o 0.14pacote. A 0.14embalagem tem 4 correções contra a montante, mas a maioria parece bastante trivial.
Faheem Mitha

Respostas:

15

Como 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.

exactpareceria 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.

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

Dominykas Mostauskis
fonte
2

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 legenda com extensões diferentes, poderá usar 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:
jasonwryan
fonte
jasonwryan, eu preferiria mantê-lo simples e esperançosamente no arquivo .config. Também atualizei minha pergunta com mais informações.
Shirish
@ shirish Não consigo imaginar nada mais simples; e se você quiser no arquivo de configuração, precisará abrir uma solicitação de recurso.
Jasonwryan
0

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

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

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

então dentro do 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
fonte