Putar subtitle secara otomatis dengan mpv

13

File subtitle datang dalam berbagai format, dari .srt ke .sub ke .ass dan seterusnya dan seterusnya. Apakah ada cara untuk memberitahu mpv untuk mencari file subtitle bersama dengan file media dan jika tidak mulai memutar file secara otomatis. Saat ini saya harus melakukan sesuatu seperti ini yang bisa sangat lama tergantung pada nama file -

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

Nantikan jawaban.

Pembaruan 1 - Film khas yang memiliki .srt (atau subskrip)

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

Baris paling menarik adalah ini: -

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

Sekarang jika file itu sebagai .ass atau .sub dengan nama file yang sama, itu tidak akan berfungsi. Saya telah mencobanya di banyak file media yang memiliki ekstensi tersebut dan setiap kali mpv memuat video dan audio dan protokol tetapi tidak pada file subtitle eksternal.

Pembaruan 2 - Bagian skrip .ass terdaftar sebagai bug di bts mpv - https://github.com/mpv-player/mpv/issues/2846

Pembaruan 3 - Telah mencoba untuk debug dengan bantuan hulu, mengajukan https://github.com/mpv-player/mpv/issues/3091 untuk itu.

Tampaknya meskipun itu bukan mpv yang bertanggung jawab tetapi ffmpeg (dan libavformat) yang seharusnya memecahkan kode subtitle. Oleh karena itu telah menambahkan ffmpeg ke dalamnya juga.

shirish
sumber
Jika file subtitle memiliki nama yang persis sama dengan file media (selain dari subskrip, tentu saja), mpv akan menggunakannya secara otomatis, saya pikir.
Faheem Mitha
Tidak. Kecuali untuk .srt, ia tidak tahu tentang orang lain. Ini pada 0,14 tak tahu apakah ini telah diperbaiki di 0,15, 0,16 atau 0,17 tiga rilis terakhir yang belum di Debian.
shirish
Oh Ya, saya selalu menggunakan srt. Anda dapat mengajukan masalah tentang itu.
Faheem Mitha
Seharusnya cukup mudah untuk membangun paket Debian untuk 0.17menggunakan 0.14kemasan. The 0.14kemasan memiliki 4 patch terhadap hulu, tetapi mereka sebagian besar terlihat cukup sepele.
Faheem Mitha

Jawaban:

15

Seperti yang terlihat di 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.

exactakan tampak seperti pilihan yang tepat, tetapi karena ini adalah default dan tidak memuat file seperti [video name minus extension].srt, fuzzyadalah taruhan terbaik berikutnya dan berfungsi pada sistem saya.

Jadi adil saja echo "sub-auto=fuzzy" >> ~/.config/mpv/mpv.conf.

Dominykas Mostauskis
sumber
2

Saya menggunakan fungsi sederhana:

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

Jika Anda ingin menguji keberadaan file subtitle dengan ekstensi berbeda, Anda bisa menggunakan pendekatan yang lebih kompleks:

#!/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
sumber
jasonwryan, saya lebih suka membuatnya sederhana dan mudah-mudahan dalam file .config. Saya juga memperbarui pertanyaan saya dengan info lebih lanjut.
shirish
@ Shirish Saya tidak bisa membayangkan sesuatu yang lebih sederhana; dan jika Anda menginginkannya dalam file konfigurasi, Anda harus membuka permintaan fitur.
jasonwryan
0

jika Anda ingin membuat sesuatu seperti ini, (klik file apa saja yang terkait dengan mpv dan mainkan dengan subtitle)

di dalam /usr/share/applications/mpv.desktop:

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

lalu di dalam mpv2.shskrip:

#!/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
pengguna3824954
sumber