Tự động phát phụ đề với mpv


13

Các tệp phụ đề có nhiều định dạng khác nhau, từ .srt đến .sub đến .ass, v.v. Có cách nào để bảo mpv tìm kiếm các tệp phụ đề cùng với các tệp phương tiện và nếu nó bắt đầu phát tệp tự động. Hiện tại tôi phải làm một cái gì đó như thế này có thể khá dài tùy thuộc vào tên tệp -

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

Rất mong nhận được câu trả lời.

Cập nhật 1 - Một bộ phim điển hình có .srt (hoặc đăng ký)

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

Dòng thú vị nhất là đây: -

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

Bây giờ nếu tệp là .ass hoặc .sub có cùng tên tệp, nó sẽ không hoạt động. Tôi đã thử nó trong nhiều tệp phương tiện có các phần mở rộng đó và mỗi lần mpv tải video và âm thanh cũng như các giao thức chứ không phải các tệp phụ đề bên ngoài.

Cập nhật 2 - Phần tập lệnh .ass được liệt kê là một lỗi tại bts của mpv - https://github.com/mpv-player/mpv/issues/2846

Cập nhật 3 - Đã cố gắng gỡ lỗi với sự trợ giúp của thượng nguồn, đã gửi https://github.com/mpv-player/mpv/issues/3091 cho điều đó.

Dường như đó không phải là mpv chịu trách nhiệm mà là ffmpeg (và libavformat) được cho là để giải mã phụ đề. Do đó đã thêm ffmpeg cho nó quá.


Nếu tập tin phụ đề có cùng tên với tập tin phương tiện (dĩ nhiên, ngoài mục phụ), mpv sẽ tự động sử dụng nó.
Faheem Mitha

Nó không. Ngoại trừ .srt nó không biết về người khác. Đây là vào 0,14 dunno nếu điều này đã được sửa trong 0,15, 0,16 hoặc 0,17 trong ba bản phát hành sau chưa có trong Debian.
shirish

Oh. Có, tôi luôn luôn sử dụng srt. Bạn có thể gửi một vấn đề về nó.
Faheem Mitha

Việc xây dựng gói Debian để 0.17sử dụng 0.14bao bì khá dễ dàng . Các 0.14bao bì có 4 bản vá lỗi chống lại thượng nguồn, nhưng họ chủ yếu trông khá tầm thường.
Faheem Mitha

Câu trả lời:


15

Như đã thấy trong 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.

exactcó vẻ như là sự lựa chọn phù hợp, nhưng vì nó là mặc định và nó không tải các tệp như thế [video name minus extension].srt, fuzzylà đặt cược tốt nhất tiếp theo và nó hoạt động trên hệ thống của tôi.

Vì vậy, chỉ cần echo "sub-auto=fuzzy" >> ~/.config/mpv/mpv.conf.


2

Tôi sử dụng một chức năng đơn giản:

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

Nếu bạn muốn kiểm tra sự hiện diện của các tệp phụ đề với các phần mở rộng khác nhau, bạn có thể sử dụng một cách tiếp cận phức tạp hơn:

#!/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, tôi muốn giữ nó đơn giản và hy vọng trong tệp .config. Tôi cũng đã cập nhật câu hỏi của tôi với nhiều thông tin hơn.
shirish

@shirish Tôi không thể tưởng tượng bất cứ điều gì đơn giản hơn; và nếu bạn muốn nó trong tệp cấu hình, bạn sẽ cần mở một yêu cầu tính năng.
jasonwryan

0

nếu bạn muốn tạo một cái gì đó như thế này, (nhấp vào bất kỳ tệp nào liên quan đến mpv và chơi với phụ đề)

bên trong /usr/share/applications/mpv.desktop:

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

sau đó bên trong mpv2.shtập lệnh:

#!/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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.