2012-07-13 31 views
27

पर नहीं खेलता है मेरे पास एक एवीप्लेयर है जो एचएलएस वीडियो स्ट्रीम चला रहा है। मेरा यूजर इंटरफेस बटन की एक पंक्ति प्रदान करता है, वीडियो में प्रत्येक "अध्याय" के लिए एक (बटन को "1", "2", "3" लेबल किया जाता है)। ऐप किसी सर्वर से कुछ मेटा-डेटा डाउनलोड करता है जिसमें सेकंड में बताए गए अध्याय कट-इन पॉइंट्स की सूची होती है। उदाहरण के लिए, एक वीडियो लंबाई में 12 मिनट है - अध्याय कट-इन पॉइंट्स की सूची 0, 58, 71, 230, 530, इत्यादि हैंAVPlayer seekToTime सही स्थिति

जब उपयोगकर्ता "अध्याय बटन" में से किसी एक को टैप करता है बटन हैंडलर कोड करता है:

  [self.avPlayer pause]; 

    [self.avPlayer seekToTime: CMTimeMakeWithSeconds(seekTime, 600) 
       toleranceBefore: kCMTimeZero 
       toleranceAfter: kCMTimeZero 
      completionHandler: ^(BOOL finished) 
      { 
       [self.avPlayer play]; 
      }]; 

कहाँ "seekTime" एक स्थानीय वर जो (जैसा ऊपर वर्णित) कट में बिंदु होता है।

समस्या यह है कि वीडियो हमेशा सही बिंदु पर शुरू नहीं होता है। कभी-कभी यह करता है। लेकिन कभी-कभी अनुरोध किए गए खोज समय से पहले यह एक सेकंड के दसवें से 2 सेकंड तक कहीं भी होता है। अनुरोधित खोज के बाद यह कभी शुरू नहीं होता है।

एनकोडर: handbrakeCLI कोडेक:

यहाँ वीडियो एन्कोडिंग पर कुछ आँकड़े हैं h.264 फ्रेम दर: 24 (वास्तव में, 23.976 - यह कैसे गोली मार दी थी के रूप में ही) वीडियो बिटरेट: एकाधिक बिटरेट (64/150/300/500/800/1200) ऑडियो बिटरेट: 128k कीफ़्रेम: 23.976 (1 प्रति सेकंड)

मैं एप्पल mediafilesegmenter उपकरण, ज़ाहिर है, और variantplaylistcreator प्लेलिस्ट उत्पन्न करने के लिए उपयोग कर रहा हूँ।

फ़ाइलों को अमेज़ॅन क्लाउड/एस 3 बाल्टी से परोसा जा रहा है।

एक क्षेत्र जिसे मैं अस्पष्ट मानता हूं वह है CMTimeMakeWithSeconds - मैंने पढ़े विभिन्न लेख/दस्तावेज़ों के आधार पर कई भिन्नताओं की कोशिश की है। उदाहरण के लिए, ऊपर अंश में मैं उपयोग कर रहा हूँ:

CMTimeMakeWithSeconds (seekTime, 600)

मैं भी कोशिश की है:

CMTimeMakeWithSeconds (seekTime, 1)

मैं नहीं बता सकता जो सही है, हालांकि दोनों एक ही असंगत परिणाम उत्पन्न करने लगते हैं!

मैं भी कोशिश की है:

CMTimeMakeWithSeconds (seekTime, 23.967)

कुछ लेख का दावा है कि यह एक अंश/denomenator की तरह काम करता है, तो n/1 सही जहां 'एन' होना सेकंड की संख्या (है चाहिए जैसा कि सीएमटाइममेकविथसेकंड्स (एन, 1) में)। लेकिन, कोड मूल रूप से एक अलग प्रोग्रामर द्वारा बनाया गया था (जो अब चला गया है) और उसने पसंदीदा टाइम्सस्केल (यानी सीएमटाइममेकविथसेकंड्स (एन, 600) के लिए 600 नंबर का उपयोग किया था।

क्या कोई भी गलत क्या कर रहा है, या यहां तक ​​कि यदि सटीकता की मैं कोशिश करने की कोशिश कर रहा हूं, तो कोई भी संकेत दे सकता है?

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

अग्रिम धन्यवाद!

उत्तर

2

कृपया [player seekToTime:CMTimeMakeWithSeconds(seekTime,1)] जैसे फ़ंक्शन का उपयोग करें।
क्योंकि आपकी सहनशीलता मान kCMTimeZero को खोजने के लिए और अधिक समय लगेगा। केसीएमटाइमेज़रो के सहिष्णुता मूल्य का उपयोग करने के बजाय आप केसीएमटाइमइंडिफिन का उपयोग कर सकते हैं जो कि मैंने पहले निर्दिष्ट फ़ंक्शन के बराबर है।

+0

मुझे खेद है, लेकिन यह सवाल का जवाब कैसे देता है? –

+1

गलत। 1 का टाइमकेल का मतलब है कि आप केवल पूरे सेकेंड को निर्दिष्ट करने के लिए निर्दिष्ट कर सकते हैं। टाइमकेल प्रति सेकंड भागों की संख्या है। वीडियो के लिए 600 का उपयोग करें, जैसा कि ऐप्पल अनुशंसा करता है, क्योंकि यह प्रति वीडियो 50, 60, 25 और 24 फ्रेम जैसे सामान्य वीडियो फ्रेम दरों का एक उत्पाद है। –

3

मेरा सुझाव: 1) उपयोग न करें [avplayer seekToTime: सहनशीलता इससे पहले: सहिष्णुता: इसके बाद: यह आपके खोज समय 4-5 सेकंड में देरी करेगा।

2) एचएलएस वीडियो प्रति खंड 10 सेकंड में कटौती। आपके अध्याय प्रारंभिक पद को उस मान को फिट करना चाहिए जो 10 की गुणा है। चूंकि सेगमेंट I फ्रेम के साथ शुरू होता है, इस तरह, आप त्वरित समय और सटीक समय प्राप्त कर सकते हैं।

+7

यदि '[avplayer seekToTime: सहनशीलता से पहले नहीं: सहनशीलता: बाद:]' का उपयोग नहीं किया जाता है तो फिर किस विधि का उपयोग किया जाना चाहिए? – Fennelouski

+1

मैं इस से सहमत नहीं हूं। सवाल यह है कि "AVPlayer seekToTime सही स्थिति पर नहीं खेलता है"। सहिष्णुता जोड़कर: सहनशीलता: इसके बाद: खोज करने के लिए पैरामीटर टॉटाइम() केसीएमटीमेज़ेरो पर सेट, आप इस समस्या को हल करेंगे, ताकि सवाल का सही जवाब हो। यदि आप इसका उपयोग नहीं करते हैं, तो यह मनमाने ढंग से होता है जहां खिलाड़ी शुरू होता है। – Bocaxica

+0

इसे इंगित करने के लिए धन्यवाद, मैंने वैकल्पिक विधि के साथ लैग समस्या हल की। –

76
int32_t timeScale = self.player.currentItem.asset.duration.timescale; 
CMTime time = CMTimeMakeWithSeconds(77.000000, timeScale); 
[self.player seekToTime:time toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero]; 

मुझे 'seekToTime' के साथ कोई समस्या थी। मैंने इस कोड के साथ अपनी समस्या हल की। इस समस्या के लिए 'timescale' चाल है।

+6

@ जोर्डन-बिगेल इसे सही उत्तर के रूप में चुना जाना चाहिए। –

+0

अच्छा समाधान @Muhmd –

+0

धन्यवाद आदमी, यह मेरा एक दिन बचा, –

0

इस कोड को यह अपनी समस्या का समाधान हो सकता है।

let targetTime = CMTimeMakeWithSeconds(videoLastDuration, 1) // videoLastDuration hold the previous video state. 
self.playerController.player?.currentItem?.seekToTime(targetTime, toleranceBefore: kCMTimeZero, toleranceAfter: kCMTimeZero) 
संबंधित मुद्दे