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의 BTS에 버그로 표시됩니다 - https://github.com/mpv-player/mpv/issues/2846

업데이트 3- https ://github.com/mpv-player/mpv/issues/3091에 업스트림 도움을 받아 디버깅을 시도 했습니다.

그것은 책임있는 mpv가 아니라 자막을 해독 해야하는 ffmpeg (및 libavformat) 인 것 같습니다. 따라서 ffmpeg도 추가했습니다.


자막 파일이 미디어 파일과 이름이 정확히 같으면 (물론 첨자 제외) mpv가 자동으로 사용한다고 생각합니다.
Faheem Mitha

그렇지 않습니다. .srt를 제외하고 다른 사람들에 대해서는 모른다. 0.15, 0.16 또는 0.17에서 아직 수정되지 않은 경우 아직 데비안에 있지 않은 3 개의 릴리스에서 0.14 dunno에 있습니다.
shirish

오. 예, 항상 사용 srt합니다. 문제를 제기 할 수 있습니다.
Faheem Mitha

패키징 을 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.