टाइम शिफ़्टिंग के साथ काम करता है

अपनी टीवी इनपुट सेवा में टाइम-शिफ़्टिंग एपीआई का इस्तेमाल करें. इससे उपयोगकर्ताओं को आपकी सेवा के चैनलों पर लाइव प्रोग्राम को रोकने, रिवाइंड करने, और फ़ास्ट-फ़ॉरवर्ड करने की सुविधा मिलेगी. अगर आपके ऐप्लिकेशन में टाइम-शिफ़्टिंग की सुविधा काम करती है, तो उपयोगकर्ताओं को यह तय करने की सुविधा मिलती है कि वे आपका कॉन्टेंट कैसे देखें:

  • उपयोगकर्ता, कुछ समय के लिए रुकावट आने पर प्रोग्राम को रोक सकते हैं, ताकि वे कोई भी ज़रूरी पल मिस न करें.
  • उपयोगकर्ता उस सामग्री को स्किप कर सकते हैं जिसे वे पहले ही देख चुके हैं या जिसमें उनकी रुचि नहीं है.
  • उपयोगकर्ता, प्रोग्राम के कॉन्टेंट में अपने पसंदीदा पलों को रिवाइंड करके फिर से देख सकते हैं.
चित्र 1. एंड्रॉइड टीवी प्लेबैक नियंत्रणों का उपयोग समय-परिवर्तन के लिए किया जाता है.

टाइम-शिफ्टिंग तकनीक लाइव प्रोग्राम को प्लेबैक करने की क्षमता को लागू करने के लिए प्रोग्राम डेटा के छोटे, अस्थायी, रिकॉर्ड किए गए खंडों का उपयोग करती है. उपयोगकर्ता इन टाइम-शिफ्टिंग रिकॉर्डिंग को वर्तमान प्लेबैक सत्र के बाहर नहीं चला सकते हैं. इसका मतलब यह है कि वे किसी कार्यक्रम को अगले दिन देखने के लिए रोकने या किसी दूसरे चैनल पर स्विच करते समय किसी कार्यक्रम को बाद में देखने के लिए रोकने के लिए टाइम-शिफ्टिंग का उपयोग नहीं कर सकते हैं.

अगर आपको उपयोगकर्ताओं को प्रोग्राम का कॉन्टेंट रिकॉर्ड करने की सुविधा देनी है, ताकि वे उसे मौजूदा प्लेबैक सेशन के बाहर देख सकें, तो टीवी रिकॉर्डिंग एपीआई का इस्तेमाल करें.

समय-स्थानांतरण समर्थन जोड़ें

अपने टीवी इनपुट सेवा में टाइम-शिफ्टिंग समर्थन जोड़ने के लिए, आपको अपने TvInputService.Session क्लास में टाइम-शिफ्टिंग एपीआई को लागू करना होगा, अपने ऐप में टाइम-शिफ्टिंग रिकॉर्डिंग की रिकॉर्डिंग और प्लेबैक को संभालना होगा, और सिस्टम को सूचित करना होगा कि आपकी इनपुट सेवा टाइम-शिफ्टिंग समर्थन प्रदान करती है.

लागू किए गए TvInputService.Session तरीके ये हैं:

  • onTimeShiftGetCurrentPosition(): सिस्टम इस फ़ंक्शन को कॉल करता है, ताकि मिलीसेकंड में मौजूदा प्लेबैक की पोज़िशन मिल सके. ज़्यादा जानकारी के लिए, वीडियो चलाने के समय को ट्रैक करना सेक्शन देखें.
  • onTimeShiftGetStartPosition(): सिस्टम द्वारा मिलीसेकंड में वर्तमान टाइम-शिफ्ट रिकॉर्डिंग की प्रारंभिक स्थिति प्राप्त करने के लिए कॉल किया जाता है. अधिक जानकारी के लिए, ट्रैक प्लेबैक समय अनुभाग देखें.
  • onTimeShiftPause(): उपयोगकर्ता द्वारा प्लेबैक रोकने पर कॉल किया जाता है.
  • onTimeShiftResume(): उपयोगकर्ता द्वारा प्लेबैक पुनः शुरू करने पर कॉल किया जाता है.
  • onTimeShiftSeekTo(long): इस फ़ंक्शन को तब कॉल किया जाता है, जब सिस्टम को नई टाइम पोज़िशन ढूंढनी होती है. सामान्यतः, नई स्थिति प्रारंभिक स्थिति और वर्तमान स्थिति के बीच होती है.
  • onTimeShiftSetPlaybackParams(PlaybackParams): सिस्टम द्वारा वर्तमान सत्र के लिए प्लेबैक पैरामीटर, जैसे कि वीडियो चलाने की स्पीड, प्रदान करने के लिए कॉल किया जाता है. ज़्यादा जानकारी के लिए, वीडियो चलाने के पैरामीटर सेक्शन देखें.

सिस्टम को यह बताने के बारे में ज़्यादा जानकारी के लिए कि आपकी इनपुट सेवा में टाइम-शिफ़्टिंग की सुविधा काम करती है, सिस्टम को टाइम-शिफ़्टिंग की स्थिति के बारे में सूचना देना सेक्शन देखें.

अगर TvInputService.Session क्लास को लागू करने के लिए, TIF Companion Library का इस्तेमाल किया जा रहा है, तो आपको ExoPlayer का इस्तेमाल करके टाइम-शिफ़्टिंग की सुविधा अपने-आप मिल जाती है. आप इस कार्यान्वयन का उपयोग कर सकते हैं या BaseTvInputService.Session में समय-स्थानांतरण एपीआई विधियों को ओवरराइड कर सकते हैं और अपना स्वयं का कार्यान्वयन प्रदान कर सकते हैं. TIF Companion Library का इस्तेमाल करने के बारे में ज़्यादा जानने के लिए, TIF Companion Library का इस्तेमाल करके, टीवी इनपुट सेवा बनाना लेख पढ़ें.

सेशन शुरू होने पर कॉन्टेंट रिकॉर्ड करना

कोई उपयोगकर्ता, चैनल के लिए वीडियो चलाने की सुविधा को कंट्रोल करने वाले बटन ऐक्सेस करके, प्रोग्राम के कॉन्टेंट को रोक सकता है, उसे पीछे ले जा सकता है, और तेज़ी से आगे बढ़ा सकता है. इसके लिए, उसे कॉन्टेंट देखते समय चुनें बटन दबाना होगा. इसके बाद, वीडियो चलाने की सुविधा को कंट्रोल करने वाले बटन पर जाना होगा. इसके अलावा, वह रिमोट डिवाइस पर वीडियो चलाने की सुविधा को कंट्रोल करने वाले बटन का इस्तेमाल करके भी ऐसा कर सकता है.

क्योंकि उपयोगकर्ता प्रोग्राम सामग्री देखते समय किसी भी समय टाइम-शिफ्टिंग का उपयोग कर सकता है, इसलिए आपकी टीवी इनपुट सेवा को आपके onTune() कार्यान्वयन में उपयोगकर्ता द्वारा चैनल ट्यून करते ही टाइम-शिफ्टिंग सामग्री रिकॉर्ड करना शुरू कर देना चाहिए. आपको सिस्टम को यह भी बताना होगा कि आपके पास रिकॉर्डिंग करने की सुविधा है. इसके लिए, notifyTimeShiftStatusChanged(int) को कॉल करें. इसके बारे में सिस्टम को टाइम-शिफ़्टिंग की स्थिति के बारे में सूचना देना सेक्शन में बताया गया है.

रिकॉर्ड की गई सामग्री के संग्रहण का प्रबंधन करें

आपकी टीवी इनपुट सेवा की यह ज़िम्मेदारी है कि वह टाइम-शिफ़्टिंग रिकॉर्डिंग को आपके ऐप्लिकेशन के प्राइवेट ऐप्लिकेशन स्टोरेज में सेव करे. साथ ही, जब सिस्टम आपके टाइम-शिफ़्टिंग के तरीकों को कॉल करे, तब कॉन्टेंट को वापस चलाए. जैसे, onTimeShiftResume(). अगर आपका कॉन्टेंट पहले से ही क्लाउड में सेव है और आपका ऐप्लिकेशन, क्लाउड में टाइम-शिफ़्ट की गई रिकॉर्डिंग को मैनेज कर सकता है, तो ऐप्लिकेशन स्टोरेज के बजाय क्लाउड स्टोरेज का इस्तेमाल किया जा सकता है.

अगर आपके कॉन्टेंट में सुरक्षित कॉन्टेंट का इस्तेमाल किया गया है, तो टीवी इनपुट सेवा की यह ज़िम्मेदारी है कि वह रिकॉर्ड किए गए कॉन्टेंट को सही तरीके से एन्क्रिप्ट (सुरक्षित) करे. साथ ही, उसे चलाने के दौरान डिक्रिप्ट (सुरक्षित कॉन्टेंट को सामान्य कॉन्टेंट में बदलना) करे.

रिकॉर्ड किए गए वीडियो कॉन्टेंट के लिए, ज़्यादा स्टोरेज की ज़रूरत पड़ सकती है. इसलिए, सेशन को वापस चलाने के दौरान, आपको रिकॉर्ड किए गए कॉन्टेंट को ध्यान से मैनेज करना होगा. अगर वीडियो चलाने के सेशन की अवधि, टाइम-शिफ़्टिंग के लिए रिकॉर्ड और सेव की जा सकने वाली अवधि से ज़्यादा है, तो टाइम-शिफ़्टिंग की रिकॉर्डिंग को अडजस्ट करें. इससे मौजूदा बफ़र बना रहेगा. हालांकि, यह पक्का करें कि मौजूदा समय कैप्चर किया गया हो. उदाहरण के लिए, अगर किसी उपयोगकर्ता ने 31 मिनट तक कॉन्टेंट चलाया है और टाइम-शिफ़्टिंग रिकॉर्डिंग का ज़्यादा से ज़्यादा साइज़ 30 मिनट है, तो रिकॉर्डिंग और शुरू होने के समय में बदलाव करें, ताकि उसमें पहले मिनट से लेकर 31वें मिनट तक का कॉन्टेंट शामिल हो.

अगर टीवी इनपुट सेवा में स्टोरेज की कमी की वजह से, टाइम-शिफ़्टिंग की सुविधा काम नहीं करती है, तो आपको सिस्टम को इसकी जानकारी देनी होगी. टाइम-शिफ़्टिंग की सुविधा से जुड़ी पाबंदियों के बारे में सिस्टम को सूचना देने के तरीके के बारे में ज़्यादा जानने के लिए, टाइम-शिफ़्टिंग की सुविधा की स्थिति के बारे में सिस्टम को सूचना देना सेक्शन देखें.

जब उपयोगकर्ता किसी दूसरे चैनल पर स्विच करता है या वीडियो चलाने का सेशन खत्म करता है, तो रिकॉर्ड किए गए टाइम-शिफ़्टिंग डेटा को मिटा दें.

समय परिवर्तन की स्थिति के बारे में सिस्टम को सूचित करें

अगर आपकी टीवी इनपुट सेवा में टाइम-शिफ़्टिंग की सुविधा काम करती है, तो जब कोई उपयोगकर्ता किसी चैनल को ट्यून करता है, तब onTune() के अपने लागू करने के तरीके में notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_AVAILABLE) को कॉल करें.

यदि आपकी इनपुट सेवा की समय-स्थानांतरण क्षमताओं में कोई परिवर्तन होता है, तो सिस्टम को सूचित करने के लिए notifyTimeShiftStatusChanged(int) का उपयोग करें. उदाहरण के लिए, अगर स्टोरेज की जगह से जुड़ी पाबंदियों या अन्य वजहों से, आपकी टीवी इनपुट सेवा टाइम-शिफ़्टिंग की सुविधा नहीं दे सकती, तो notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_UNAVAILABLE) पर कॉल करें.

अगर टीवी इनपुट सेवा, टाइम-शिफ़्टिंग की सुविधा नहीं देती है, तो कॉल notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_UNSUPPORTED) तब करें, जब कोई प्लेबैक सेशन बनाया जाता है. सिस्टम, ऐसी किसी भी इनपुट सेवा को टाइम-शिफ़्टिंग की सुविधा के साथ काम नहीं करने वाली इनपुट सेवा के तौर पर मानता है जो कभी भी notifyTimeShiftStatusChanged() को कॉल नहीं करती. इसमें एपीआई लेवल 22 और इससे पहले के वर्शन का इस्तेमाल करने वाली इनपुट सेवाएं शामिल हैं.

वीडियो चलाने की अवधि को ट्रैक करना

टाइम-शिफ्टिंग रिकॉर्डिंग की प्रारंभिक स्थिति, युग के बाद से मिलीसेकंड में, सबसे शुरुआती निरपेक्ष समय स्थिति होती है, जिस तक उपयोगकर्ता पहुंच सकता है. आम तौर पर, यह वह समय होता है जब onTune() को कॉल करने के बाद वीडियो चलना शुरू होता है. हालांकि, जब उपयोगकर्ता इतना कॉन्टेंट देख लेता है जिसे आपका ऐप्लिकेशन रिकॉर्ड नहीं कर सकता, तो आपको टाइम-शिफ़्टिंग के लिए नया सेगमेंट रिकॉर्ड करना होगा. साथ ही, आपको उसके हिसाब से शुरुआती समय को अपडेट करना होगा.

टाइम-शिफ़्टिंग रिकॉर्डिंग की मौजूदा स्थिति, वीडियो चलाने की मौजूदा स्थिति होती है. यह स्थिति, epoch के बाद से मिलीसेकंड में होती है. प्लेबैक के दौरान यह स्थिति लगातार बदलती रहती है. आम तौर पर, इस वैल्यू का पता लगाने के लिए, प्लेबैक इंजन का इस्तेमाल किया जा सकता है. इसका उदाहरण यहां दिया गया है:

Kotlin

override fun onTimeShiftGetCurrentPosition(): Long =
        tvPlayer?.run {
            currentProgram?.let { program ->
                currentPosition + program.startTimeUtcMillis
            }
        } ?: TvInputManager.TIME_SHIFT_INVALID_TIME

Java

@Override
public long onTimeShiftGetCurrentPosition() {
  if (getTvPlayer() != null && currentProgram != null) {
    return getTvPlayer().getCurrentPosition() +
      currentProgram.getStartTimeUtcMillis();
  }
  return TvInputManager.TIME_SHIFT_INVALID_TIME;
}

पक्का करें कि सिस्टम के onTimeShiftGetStartPosition() को कॉल करने पर, शुरू होने का जो समय दिया गया है वह onTimeShiftGetCurrentPosition() में दी गई मौजूदा समय की पोज़िशन से ज़्यादा न हो. सिस्टम इन कॉल का इस्तेमाल, प्लेबैक कंट्रोल के यूज़र इंटरफ़ेस (यूआई) में टाइम-शिफ़्टिंग की अवधि को अपडेट करने के लिए करता है.

वीडियो चलाने के पैरामीटर इस्तेमाल करने की सुविधा

टाइम-शिफ्टिंग के दौरान वीडियो चलाने की स्पीड को बदलने के लिए, सिस्टम प्लेबैक पैरामीटर का उपयोग करता है. उदाहरण के लिए, अगर उपयोगकर्ता मौजूदा वीडियो को रिवाइंड करने का फ़ैसला करता है, तो वीडियो चलाने के नए पैरामीटर आपके ऐप्लिकेशन को वीडियो चलाने की नेगेटिव स्पीड के साथ पास किए जाते हैं. टाइम-शिफ़्टिंग की सुविधा में, वीडियो को पीछे ले जाने या तेज़ी से आगे बढ़ाने के लिए, वीडियो चलाने की स्पीड को कई लेवल पर सेट किया जा सकता है. जैसे, 2x या 3x.

सिस्टम आपके onTimeShiftSetPlaybackParams(PlaybackParams) मेथड को PlaybackParams ऑब्जेक्ट के साथ कॉल करता है जिसमें वर्तमान सेशन के लिए पैरामीटर होते हैं. इस जानकारी का इस्तेमाल करके, मीडिया चलाने वाले इंजन को सही तरीके से कॉन्फ़िगर करें.

अगर आपका प्लेबैक इंजन किसी पैरामीटर के साथ काम नहीं करता है, तो उम्मीद के मुताबिक काम करने की पूरी कोशिश करें. उदाहरण के लिए, यदि आपका प्लेबैक इंजन 2x गति का समर्थन नहीं करता है, तो लगभग दोगुनी वीडियो चलाने की स्पीड प्राप्त करने के लिए अपने प्लेबैक इंजन पर बार-बार सीक ऑपरेशन का उपयोग करें.

पैरामीटर सेट हो जाने के बाद, सेटिंग्स को तब तक न बदलें जब तक कि उपयोगकर्ता या तो कोई प्लेबैक कमांड जारी न करे जिसके लिए किसी भिन्न पैरामीटर की आवश्यकता हो या किसी नए चैनल पर स्विच न करे.