नीचे दिए गए प्रश्न के लिए ध्यान दें: सभी संपत्ति डिवाइस पर स्थानीय हैं - कोई नेटवर्क स्ट्रीमिंग नहीं हो रही है। वीडियो में ऑडियो ट्रैक हैं।
मैं एक iOS एप्लिकेशन पर काम कर रहा हूं जिसमें वीडियो क्लिप को शुरू करने के लिए न्यूनतम देरी के साथ वीडियो फ़ाइलों को चलाने की आवश्यकता होती है। दुर्भाग्य से हम नहीं जानते हैं कि विशिष्ट वीडियो क्लिप तब तक क्या है जब तक हमें वास्तव में इसे शुरू करने की आवश्यकता नहीं है। विशेष रूप से: जब एक वीडियो क्लिप चल रहा होता है, तो हम जानेंगे कि 10 वीडियो क्लिप का अगला सेट (मोटे तौर पर) क्या है, लेकिन हम यह नहीं जानते कि कौन सा वास्तव में है, जब तक कि यह अगली क्लिप को 'तुरंत' खेलने का समय नहीं आता है।
मैंने वास्तविक शुरुआत देरी को देखने के लिए क्या किया है addBoundaryTimeObserverForTimes
, वीडियो प्लेयर पर कॉल करने के लिए एक मिलीसेकंड की समयावधि के साथ यह देखना है कि वीडियो वास्तव में कब खेलना शुरू हुआ, और मैं उस समय के अंतर को पहले स्थान के साथ मोहर लेता हूं कोड जो इंगित करता है कि किस परिसंपत्ति को खेलना शुरू करना है।
मैंने इस प्रकार जो देखा है, उससे मैंने पाया है कि AVAsset
लोडिंग के संयोजन का उपयोग करना , और फिर AVPlayerItem
उस से एक बार तैयार होने के बाद, और फिर AVPlayerStatusReadyToPlay
मैं कॉल प्ले करने से पहले प्रतीक्षा करना शुरू करने के लिए 1 और 3 सेकंड के बीच ले जाता हूं। क्लिप।
जब से मुझे लगता है कि मैं लगभग बराबर हो गया हूँ: मैंने फोन किया [AVPlayerItem playerItemWithURL:]
और AVPlayerItemStatusReadyToPlay
खेलने की प्रतीक्षा कर रहा था। मोटे तौर पर वही प्रदर्शन।
एक बात जो मैं देख रहा हूँ, वह यह है कि पहला AVPlayer आइटम लोड बाकी की तुलना में धीमा है। लगता है कि पहले वीडियो को चलाने की कोशिश करने से पहले एक छोटी / खाली संपत्ति के साथ AVPlayer को प्री-फ्लाइट करना अच्छा व्यवहार हो सकता है। [ AVAudioPlayer के लिए धीमी शुरुआत जब पहली बार ध्वनि बजाई जाती है
मुझे वीडियो को जितना संभव हो सके शुरू करने में अच्छा लगेगा, और प्रयोग करने के लिए चीजों के कुछ विचार होंगे, लेकिन किसी से कुछ मार्गदर्शन चाहते हैं जो मदद करने में सक्षम हो।
अपडेट: विचार 7, नीचे, जैसा कि कार्यान्वित किया गया है, लगभग 500 एमएस के स्विचिंग समय में पैदावार देता है। यह एक सुधार है, लेकिन इसे और भी तेजी से प्राप्त करना अच्छा होगा।
विचार 1: N AVPlayers का उपयोग करें (काम नहीं करेगा)
~ 10 AVPPlayer
ऑब्जेक्ट्स का उपयोग करना और सभी ~ 10 क्लिप को स्टार्ट-एंड-पॉज़ करना, और एक बार हमें पता चल जाता है कि हमें वास्तव में किस चीज़ की ज़रूरत है, सही स्विच करें और अन-पॉज़ करें AVPlayer
और अगले चक्र के लिए फिर से शुरू करें।
मुझे नहीं लगता कि यह काम करता है, क्योंकि मैंने पढ़ा है कि AVPlayer's
आईओएस में लगभग 4 सक्रिय की सीमा है । वहाँ कोई StackOverflow पर यहाँ के बारे में पूछ रहा था, और 4 AVPlayer सीमा के बारे में पता चला: फास्ट-स्विचिंग-बीच-वीडियो-उपयोग-एवफ़ाउंडेशन
विचार 2: AVQueuePlayer (काम नहीं करेगा) का उपयोग करें
मुझे विश्वास नहीं है कि 10 AVPlayerItems
में shoving एक AVQueuePlayer
पूर्व लोड होगा उन सभी को सहज शुरुआत के लिए। AVQueuePlayer
एक कतार है, और मुझे लगता है कि यह वास्तव में कतार में अगले वीडियो को तत्काल प्लेबैक के लिए तैयार करता है। मुझे नहीं पता कि ~ 10 वीडियो में से कौन सा हम वापस खेलना चाहते हैं, जब तक कि उस एक को शुरू करने का समय नहीं है। ios-avplayer-वीडियो-पहले से लोड होने
विचार 3: लोड करें, खेलें, और AVPlayerItems
पृष्ठभूमि में बनाए रखें (100% अभी तक निश्चित नहीं है - लेकिन अच्छा नहीं लग रहा है)
मैं देख रहा हूं कि क्या पृष्ठभूमि में प्रत्येक वीडियो क्लिप के पहले सेकंड को लोड करने और चलाने के लिए कोई लाभ है (वीडियो और ऑडियो आउटपुट को दबाएं), और प्रत्येक के लिए एक संदर्भ रखें AVPlayerItem
, और जब हम जानते हैं कि किस आइटम के लिए खेला जाना चाहिए वास्तविक, उस एक को स्वैप करें और सक्रिय के साथ पृष्ठभूमि AVPlayer को स्वैप करें। धोये और दोहराएं।
सिद्धांत यह होगा कि हाल ही में खेला गया AVPlayer/AVPlayerItem
अभी भी कुछ तैयार संसाधनों को पकड़ सकता है जो बाद के प्लेबैक को तेज करेगा। अब तक, मैंने इससे लाभ नहीं देखा है, लेकिन मेरे पास AVPlayerLayer
पृष्ठभूमि के लिए सेटअप ठीक से नहीं है । मुझे संदेह है कि यह वास्तव में चीजों को सुधार देगा जो मैंने देखा है।
विचार 4: एक अलग फ़ाइल प्रारूप का उपयोग करें - हो सकता है कि लोड करने में तेज़ हो?
मैं वर्तमान में उपयोग कर रहा हूँ .M4v (वीडियो-एमपीईजी 4) एच .264 प्रारूप। H.264 में बहुत सारे अलग-अलग कोडेक विकल्प हैं, इसलिए यह संभव है कि कुछ विकल्प दूसरों की तुलना में तेजी से पसंद करते हैं। मैंने पाया है कि अधिक उन्नत सेटिंग्स का उपयोग करने से फ़ाइल का आकार छोटा हो जाता है, जो कि समय को बढ़ाता है, लेकिन ऐसा कोई विकल्प नहीं मिला है जो दूसरे रास्ते पर जाता हो।
विचार 5: दोषरहित वीडियो प्रारूप + AVQueuePlayer का संयोजन
यदि एक वीडियो प्रारूप है जो लोड करने के लिए तेज़ है, लेकिन हो सकता है कि फ़ाइल का आकार पागल है, तो एक विचार प्रत्येक वीडियो क्लिप के पहले 10 सेकंड को एक संस्करण के साथ तैयार करने के लिए हो सकता है जो फूला हुआ है लेकिन लोड करने के लिए तेज़ है, लेकिन वापस उस संपत्ति के साथ जो H.264 में एन्कोडेड है। एक AVQueuePlayer का उपयोग करें, और पहले 10 सेकंड को असम्पीडित फ़ाइल प्रारूप में जोड़ें, और उस एक का पालन करें जो कि H.264 में है जो तैयार / प्रीलोड समय के 10 सेकंड तक हो जाता है। इसलिए मुझे दोनों दुनियाओं का 'सर्वश्रेष्ठ' मिलेगा: तेज शुरुआत समय, लेकिन अधिक कॉम्पैक्ट प्रारूप से भी लाभ होगा।
विचार 6: एक गैर-मानक AVPlayer का उपयोग करें / मेरा स्वयं लिखें / किसी और का उपयोग करें
मेरी जरूरतों को देखते हुए, शायद मैं AVPlayer का उपयोग नहीं कर सकता, लेकिन AVAssetReader का सहारा लेना होगा, और पहले कुछ सेकंड (संभवतः डिस्क पर कच्ची फ़ाइल लिखना) को डिकोड करना होगा, और जब यह प्लेबैक की बात आती है, तो इसे खेलने के लिए कच्चे प्रारूप का उपयोग करें। वापस तेजी से। मेरे लिए एक बड़ी परियोजना की तरह लगता है, और अगर मैं इसके बारे में एक भोली तरीके से जाना, यह स्पष्ट नहीं है / यह भी बेहतर काम करने की संभावना नहीं है। प्रत्येक डिकोड और असम्पीडित वीडियो फ्रेम 2.25 एमबी है। Naively बोल - अगर हम वीडियो के लिए ~ 30 एफपीएस के साथ जाते हैं, तो मैं ~ 60 एमबी / एस की रीड-से-डिस्क आवश्यकता के साथ समाप्त करूंगा, जो शायद असंभव है / इसे धक्का दे रहा है। जाहिर है हम छवि संपीड़न के कुछ स्तर (शायद देशी ओपन / PVRTC के माध्यम से सम्पीडन प्रारूप) करना होगा ... लेकिन यह दयालु है। शायद वहाँ एक पुस्तकालय है जो मैं उपयोग कर सकता हूं?
आइडिया 7: सब कुछ एक ही फिल्म की संपत्ति में मिलाएं, और तलाश करें
एक विचार जो ऊपर दिए गए कुछ की तुलना में आसान हो सकता है, वह है सब कुछ एक ही फिल्म में संयोजित करना, और चाहने वालों का उपयोग करना। बात यह है कि हम सभी जगह कूद पड़ेंगे। फिल्म में अनिवार्य रूप से यादृच्छिक अभिगम। मुझे लगता है कि यह वास्तव में ठीक काम कर सकता है: एविलेर-मूवी-प्लेइंग-लैग-इन-आईओएस 5
आपको कौन सा दृष्टिकोण सबसे अच्छा लगेगा? अब तक, मैंने लैग को कम करने के मामले में उतनी प्रगति नहीं की है।