एमपीवी के साथ स्वचालित रूप से उपशीर्षक खेलें


13

उपशीर्षक फ़ाइलें विभिन्न स्वरूपों में आती हैं, .srt से .sub तक .ass और इसी तरह आगे और आगे। क्या मीडिया फ़ाइलों के साथ उपशीर्षक फ़ाइलों की खोज करने के लिए एमपीवी को बताने का एक तरीका है और यदि यह स्वचालित रूप से फ़ाइल खेलना शुरू करता है। वर्तमान में मुझे कुछ ऐसा करना है जो फ़ाइलनाम के आधार पर बहुत लंबा हो सकता है -

[$] 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 दायर किया है।

ऐसा लगता है कि यह एमपीवी नहीं है जो जिम्मेदार है, लेकिन ffmpeg (और libavformat) जो उपशीर्षक को डिकोड करने वाला है। इसलिए इसे भी ffmpeg जोड़ा है।


अगर सबटाइटल फ़ाइल का मीडिया फ़ाइल के समान नाम है (सबस्क्रिप्ट से अलग, निश्चित रूप से), तो एमपीवी इसे स्वचालित रूप से उपयोग करेगा, मुझे लगता है।
फहीम मीठा

यह नहीं है .Srt को छोड़कर यह दूसरों के बारे में नहीं जानता। यदि यह 0.15, 0.16 या 0.17 बाद के तीन रिलीज में तय किया गया है तो यह 0.14 डननो पर है जो अभी तक डेबियन में नहीं हैं।
शिरीष

ओह। हां, मैं हमेशा उपयोग करता हूं srt। आप इसके बारे में एक मुद्दा दर्ज कर सकते हैं।
फहीम मीठा

पैकेजिंग 0.17का उपयोग करने के लिए डेबियन पैकेज का निर्माण करना काफी आसान होना चाहिए 0.140.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, मैं इसे सरल और उम्मीद के साथ .config फ़ाइल में रखना पसंद करूंगा। मैंने अधिक जानकारी के साथ अपने प्रश्न को भी अद्यतन किया है।
शिरीष

@ आशीष मैं कुछ भी सरल नहीं सोच सकता; और यदि आप इसे विन्यास फाइल में चाहते हैं, तो आपको एक सुविधा अनुरोध खोलने की आवश्यकता होगी।
जसोनव्रीयन

0

अगर आप ऐसा कुछ बनाना चाहते हैं, (एमपीवी से जुड़ी किसी भी फाइल पर क्लिक करें और सबटाइटल्स के साथ खेलें)

अंदर /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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.