mpv는 자동으로 자막을 재생합니다

mpv는 자동으로 자막을 재생합니다

자막 파일은 .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의 bts에 오류로 나열됩니다.https://github.com/mpv-player/mpv/issues/2846

업데이트 3 - 업스트림의 도움을 받아 디버깅을 시도하고 커밋했습니다.https://github.com/mpv-player/mpv/issues/3091그런 이유로.

mpv가 아닌 자막 디코딩을 담당하는 ffmpeg(및 libavformat)인 것 같습니다. 그래서 ffmpeg도 추가되었습니다.

답변1

본 것처럼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:

답변3

비슷한 것을 만들고 싶다면 (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

관련 정보