Воспроизведение субтитров автоматически с 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 указана как ошибка в bts для mpv - https://github.com/mpv-player/mpv/issues/2846

Обновление 3 - пытался отлаживать с помощью апстрима, подал https://github.com/mpv-player/mpv/issues/3091 для этого.

Хотя кажется, что это не mpv, а ffmpeg (и libavformat), который должен декодировать субтитры. Следовательно, к нему тоже добавили ffmpeg.

Shirish
источник
Если файл субтитров имеет точно такое же имя, что и файл мультимедиа (кроме индекса, конечно), я думаю, mpv будет использовать его автоматически.
Фахим Митха
Это не так. За исключением .SRT он не знает о других. Это на 0,14 не знаю, если это было исправлено в 0,15, 0,16 или 0,17 последних трех выпусках, которых еще нет в Debian.
Шириш
Ой. Да, я всегда использую srt. Вы можете подать вопрос об этом.
Фахим Митха
Должно быть довольно легко собрать пакет Debian для 0.17использования 0.14упаковки. 0.14Упаковка имеет 4 патчей вверх по течению, но в основном они выглядят довольно тривиальны.
Фахим Митха

Ответы:

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
источник
jasonwryan, я бы предпочел сохранить это простым и, надеюсь, в файле .config. Я также обновил свой вопрос с дополнительной информацией.
Шириш
@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
user3824954
источник