Автоматично відтворювати субтитри за допомогою mpv


13

Файли субтитрів бувають у різних форматах, від .srt до .sub до .ass і так далі тощо. Чи є спосіб сказати mpv шукати файли субтитрів разом із медіа-файлами, і якщо це зробити, то автоматично починати відтворення файлу. В даний час я повинен зробити щось подібне, що може бути досить довгим, залежно від імені файлу -

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

Чекайте відповідей.

Оновлення 1 - типовий фільм, у якому є .srt (або підпис)

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

Найцікавіший рядок:

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

Тепер, якщо файл був як .ass або .sub з тим самим іменем файлу, він би не працював. Я спробував це у багатьох медіафайлах, які мають ці розширення, і кожен раз mpv завантажує відео та аудіо та протоколи, але не зовнішні файли субтитрів.

Оновлення 2 - Частина сценарію .ass вказана як помилка у бітах mpv - https://github.com/mpv-player/mpv/isissue/2846

Оновлення 3 - Намагалися налагодити за допомогою upstream, подав https://github.com/mpv-player/mpv/isissue/3091 для цього.

Здається, що це не mpv, який відповідає, але ffmpeg (і libavformat), який повинен розшифровувати субтитри. Значить, до нього також додали ffmpeg.


Якщо файл субтитрів має точно те саме ім'я, що і медіа-файл (окрім підписки, звичайно), mpv використовуватиме його автоматично, я думаю.
Faheem Mitha

Це не так. За винятком .srt він не знає про інших. Це на 0,14 данно, якщо це було зафіксовано в 0,15, 0,16 або 0,17, останні три випуски, яких ще немає в Debian.
shirish

Ой. Так, я завжди користуюся srt. Ви можете подати проблему з цього приводу.
Faheem Mitha

Створити пакет Debian для 0.17використання 0.14упаковки слід досить просто . У 0.14упаковці є 4 патчі проти течії, але вони в основному виглядають досить тривіально.
Faheem Mitha

Відповіді:


15

Як видно з 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Здавалося б, відповідний вибір, але оскільки він є типовим і він не завантажує файли [video name minus extension].srt, fuzzyнаступна найкраща ставка, і вона працює в моїй системі.

Так просто echo "sub-auto=fuzzy" >> ~/.config/mpv/mpv.conf.


2

Я використовую просту функцію:

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

Якщо ви хочете перевірити наявність файлів субтитрів з різними розширеннями, ви можете скористатися більш складним підходом:

#!/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, я вважаю за краще зберігати його просто і, сподіваюся, у файлі .config. Я також оновив своє запитання з додатковою інформацією.
shirish

@shirish Я не уявляю нічого простішого; і якщо ви хочете його у конфігураційному файлі, вам потрібно буде відкрити запит на функцію.
Jasonwryan

0

якщо ви хочете створити щось подібне, (натисніть будь-який файл, пов'язаний з mpv, і грайте з субтитрами)

всередині /usr/share/applications/mpv.desktop:

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

потім всередині 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.