Mpv ile otomatik olarak altyazıları oynat


13

Altyazı dosyaları, .srt'den .sub'a ve .ass ve benzerlerine kadar çeşitli biçimlerde gelir. Mpv'ye medya dosyalarıyla birlikte altyazı dosyaları aramasını ve dosyayı otomatik olarak oynatmaya başlayıp başlamadığını söylemenin bir yolu var mı? Şu anda dosya adına bağlı olarak oldukça uzun olabilen böyle bir şey yapmalıyım -

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

Cevapları dört gözle bekliyoruz.

Güncelleme 1 - .srt (veya alt simge) olan tipik bir film

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

En ilginç çizgi şudur: -

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

Şimdi dosya aynı dosya adına sahip .ass veya .sub biçimindeyse, çalışmaz. Ben bu uzantıları olan birçok medya dosyalarında denedim ve her zaman mpv video ve ses ve protokolleri yükler ama harici altyazı dosyaları değil.

Güncelleme 2 - .ass komut dosyası bölümü, mpv'nin bts dosyasında hata olarak listeleniyor - https://github.com/mpv-player/mpv/issues/2846

Güncelleme 3 - Yukarı akış yardımı ile hata ayıklamaya çalışıyor, bunun için https://github.com/mpv-player/mpv/issues/3091 başvurusunda bulundu .

Sorumlu olan mpv değil, altyazıların kodunu çözmesi beklenen ffmpeg (ve libavformat) gibi görünüyor. Bu yüzden de ffmpeg ekledik.


Altyazı dosyası medya dosyasıyla tam olarak aynı ada sahipse (elbette abonelik dışında), mpv otomatik olarak kullanacağını düşünüyorum.
Faheem Mitha

Öyle değil. .Srt dışında başkaları hakkında bir şey bilmiyor. Bu, 0.15, 0.16 veya 0.17'de henüz Debian'da olmayan son üç sürümde düzeltilmişse 0.14 dunno'dur.
shirish

Ah. Evet, her zaman kullanırım srt. Bununla ilgili bir sorun oluşturabilirsiniz.
Faheem Mitha

Ambalajı 0.17kullanmak için bir Debian paketi oluşturmak oldukça kolay olmalıdır 0.14. 0.14Ambalaj memba karşı 4 yamaları vardır, ama bunlar çoğunlukla oldukça önemsiz görünüyor.
Faheem Mitha

Yanıtlar:


15

Görüldüğü gibi 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.

exactUygun bir seçim gibi görünebilir, ancak varsayılan ve o gibi dosyaları yüklemek olmadığından ederim [video name minus extension].srt, fuzzybir sonraki en iyi bahistir ve benim sisteminde çalışır.

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


2

Basit bir işlev kullanıyorum:

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

Farklı uzantılara sahip altyazı dosyalarının varlığını test etmek istiyorsanız, daha karmaşık bir yaklaşım kullanabilirsiniz:

#!/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, basit ve umarım .config dosyasında tutmayı tercih ederim. Ayrıca sorumu daha fazla bilgi ile güncelledim.
shirish

@shirish Daha basit bir şey hayal edemiyorum; ve config dosyasında istiyorsanız, bir özellik isteği açmanız gerekir.
jasonwryan

0

böyle bir şey oluşturmak istiyorsanız (mpv ile ilişkili herhangi bir dosyayı tıklayın ve altyazılarla oynayın)

içeride /usr/share/applications/mpv.desktop:

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

sonra mpv2.shbetiğin içinde :

#!/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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.