Riproduci i sottotitoli automaticamente con mpv


13

I file dei sottotitoli sono disponibili in vari formati, da .srt a .sub a .ass e così via e così via. C'è un modo per dire a mpv di cercare i file dei sottotitoli insieme ai file multimediali e se lo fa per avviare la riproduzione automatica del file. Attualmente devo fare qualcosa del genere che può essere piuttosto lungo a seconda del nome del file -

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

In attesa di risposte.

Aggiornamento 1 - Un film tipico che ha .srt (o pedice)

[$] 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 linea più interessante è questa: -

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

Ora se il file fosse come .ass o .sub con lo stesso nome file, non funzionerebbe. L'ho provato in molti file multimediali che hanno quelle estensioni e ogni volta che mpv carica video e audio e protocolli ma non i file di sottotitoli esterni.

Aggiornamento 2 - La parte dello script .ass è elencata come bug nei bts di mpv - https://github.com/mpv-player/mpv/issues/2846

Aggiornamento 3 - Ho cercato di eseguire il debug con l'aiuto di upstream, archiviato https://github.com/mpv-player/mpv/issues/3091 per questo.

Sembra però che non sia mpv a essere responsabile ma ffmpeg (e libavformat) che dovrebbe decodificare i sottotitoli. Quindi ho aggiunto anche ffmpeg.


Se il file dei sottotitoli ha esattamente lo stesso nome del file multimediale (a parte il pedice, ovviamente), penso che mpv lo userà automaticamente.
Faheem Mitha,

Non Fatta eccezione per .srt, non conosce gli altri. Questo è su 0.14 non so se questo è stato corretto in 0.15, 0.16 o 0.17 nelle ultime tre versioni che non sono ancora in Debian.
shirish

Oh. Sì, lo uso sempre srt. È possibile presentare un problema al riguardo.
Faheem Mitha,

Dovrebbe essere abbastanza facile costruire un pacchetto Debian per 0.17usare il pacchetto 0.14. La 0.14confezione ha 4 patch contro l'upstream, ma per lo più sembrano piuttosto banali.
Faheem Mitha,

Risposte:


15

Come visto in 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.

exactsembrerebbe la scelta appropriata, ma poiché è l'impostazione predefinita e non carica file come [video name minus extension].srt, fuzzyè la prossima scommessa migliore e funziona sul mio sistema.

Quindi, solo echo "sub-auto=fuzzy" >> ~/.config/mpv/mpv.conf.


2

Uso una semplice funzione:

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

Se si desidera verificare la presenza di file di sottotitoli con estensioni diverse, è possibile utilizzare un approccio più complesso:

#!/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, preferirei mantenerlo semplice e, si spera, nel file .config. Ho anche aggiornato la mia domanda con maggiori informazioni.
shirish

@shirish Non riesco a immaginare niente di più semplice; e se lo desideri nel file di configurazione, dovrai aprire una richiesta di funzionalità.
Jasonwryan,

0

se vuoi creare qualcosa del genere, (fai clic su qualsiasi file associato a mpv e gioca con i sottotitoli)

all'interno /usr/share/applications/mpv.desktop:

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

quindi all'interno della mpv2.shsceneggiatura:

#!/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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.