2013-02-12 18 views
11

हमारे पास एक ऐप है जिसे हम AVPlayer के माध्यम से वीडियो फ़ाइलों के प्लेबैक प्रदान करने के लिए आवश्यक हैं। फ़ाइलों को उपयोगकर्ता के डिवाइस पर संग्रहीत करने की आवश्यकता है, लेकिन डाउनलोड करते समय प्लेबैक भी होना चाहिए।एवीप्लेयर और प्रगतिशील वीडियो डाउनलोड AVURLAssets

फिलहाल हमने एक डाउनलोड मॉड्यूल बनाया है जो ASIHTTPRequest लाइब्रेरी का उपयोग PHP के माध्यम से वीडियो फ़ाइलों को प्राप्त करने के लिए करता है (हम नहीं चाहते हैं कि मीडिया सार्वजनिक यूआरएल के माध्यम से लिंक करने योग्य हो) और उन्हें डिस्क को असीमित रूप से लिखें।

हमने AV Foundation Programming Guide के अनुसार एक एवीप्लेयर स्थापित किया है, जिसमें AVURLAsset के साथ फ़ाइल प्राप्त हो रही है, संपत्ति के साथ एवीप्लेयर इटैम बना रही है, आइटम के साथ एवीप्लेयर का निर्माण कर रहा है, फिर खिलाड़ी को AVPlayerLayer पर सेट कर रहा है। खिलाड़ी पूरी तरह से डाउनलोड की गई वीडियो फ़ाइल के साथ ठीक चलता है और सिम्युलेटर में पूरी तरह से को एक प्रगतिशील डाउनलोड फ़ाइल भी चलाएगा।

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

आखिरी झुर्रियां यह है कि यदि वीडियो को एवीकंपोजिशन में डाला जाता है और एवीप्लेयर उसके साथ बनाया जाता है, तो प्रगतिशील वीडियो ठीक खेलेंगे। यह एक अच्छा समाधान होगा (और किसी भी अवसर पर हमारे ऐप के लिए जरूरी है) सिवाय इसके कि क्लाइंट को हमारे ऐप के लिए यह आवश्यक है कि वीडियो ऐप्पल टीवी पर एयरप्ले के माध्यम से बजाने योग्य हो, जो AVCompositions अक्षम हैं।

क्या किसी को पता है कि AVURLASSets से निर्मित एवीप्लेयर का उपयोग करके वीडियो फ़ाइलों को क्रमिक रूप से डाउनलोड करने का कोई तरीका है या नहीं? क्या प्लेयर/प्लेयर को डिस्क से पढ़ने के लिए एक तरीका है AVVLASSet के साथ डिस्क को वीडियो में कैशिंग लगने की बजाए एवीकंपोजिशन के साथ ऐसा लगता है?

धन्यवाद!

+0

क्या आपने कभी इस मुद्दे के माध्यम से काम किया है? आईओएस का किस संस्करण पर आप थे और इस व्यवहार को हाल के संस्करणों के साथ बदल दिया? –

+0

नहीं, मेरे पास अभी भी AVComposition का उपयोग करने के अलावा इस के लिए कोई समाधान नहीं है। हम उस समय आईओएस 5.1 और 6.0 का उपयोग कर रहे थे और व्यवहार अभी भी 6.1 के माध्यम से जारी है। –

+0

@RobertNall मैं वही काम करने की कोशिश कर रहा हूं जो आप AVComposition के साथ हैं - क्या आप थोड़ा विस्तार कर सकते हैं कि आपने वीडियो को AVComposition में कैसे डाला? यदि खिलाड़ी ईओएफ तक पहुंचता है, तो अधिक डेटा डाउनलोड होने के बाद प्लेबैक फिर से शुरू होता है? –

उत्तर

6

मेरे पास यह केवल बुद्धिमान काम करने के लिए समाधान नहीं है AVURLAssets लेकिन मैं थोड़ा अलग दृष्टिकोण का उपयोग करता हूं। हम CocoaHTTPServer के साथ हमारी ऐप को बंडल करते हैं और वीडियो फ़ाइलों को चलाते हैं जो स्थानीय सर्वर के खिलाफ एक HTTP अनुरोध पूरी तरह से डाउनलोड नहीं होते हैं।

सर्वर फ़ाइल की कुल लंबाई जानता है और फिर HTTP-हेडर को देखकर निर्णय ले सकता है कि फ़ाइल का कौन सा हिस्सा अनुरोध है और या तो इसे डिस्क से या दूरस्थ स्रोत से लोड करता है।

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

आपको HTTPConnection को उपclass करना होगा और प्रदान की गई "HTTPAsyncFileResponse" को देखकर अपना स्वयं का HTTPResponse क्लास बनाना होगा।

मुझे उम्मीद है कि यह आपको एक अलग दृष्टिकोण के साथ इसे पूरा करने का विचार देता है।

+0

जब आप उस फ़ाइल को प्राप्त करते हैं जिसमें फ़ाइल का अंतिम हिस्सा होता है, तो क्या आप शुरुआत और अंत के बीच खाली बाइट लिख रहे हैं ताकि खिलाड़ी सही बाइट्स को सही जगह पर कर सके? –

+0

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

+0

इस बारे में फिर से सोचते हुए, आप इस तरह कुछ भी कोशिश कर सकते हैं: http://aptogo.co.uk/2010/07/protecting-resources/ लेकिन इसके बजाय क्रिप्टो सामान जो आप दूरस्थ/स्थानीय से पढ़ने/लिखने को लागू कर सकते हैं। – Soph

संबंधित मुद्दे