2009-05-25 14 views
17

मैं एक ऐप लिख रहा हूं, जिसमें से एक हिस्सा उपयोगकर्ता स्ट्रीम/वीडियो चलाता है। मैं कार्यक्षमता को प्रतिबंधित करना चाहता हूं ताकि वे केवल वाईफाई कनेक्शन वाले वीडियो स्ट्रीम कर सकें। मैं फिर वीडियो को सहेज दूंगा ताकि जब उनके पास केवल 3 जी (या कम) कनेक्शन हो, तो वे वीडियो स्ट्रीम नहीं कर सकते हैं और केवल फोन पर सहेजे गए वीडियो को फिर से चला सकते हैं।साथ ही एक वीडियो स्ट्रीम और सहेजते हैं?

आदर्श रूप से, मैं फिल्म को स्ट्रीम/प्ले करने के लिए MPMoviePlayerController प्राप्त करना चाहता हूं और फिर फिल्म डेटा तक पहुंच सकता हूं और इसे सहेज सकता हूं। हालांकि, MPMoviePlayerController एपीआई मूवी डेटा तक पहुंच का समर्थन नहीं करता है।

मैं टालना और डाउनलोड-प्ले-प्ले परिदृश्य से बचना चाहता हूं। कोई विचार?

+0

हाय, क्या आप इसके साथ सफलता प्राप्त कर चुके हैं? – Bkillnest

उत्तर

11

दो समाधान दिमाग में आते हैं। इन दोनों समाधानों की आवश्यकता है कि फ़ाइल एक प्रारूप में है जिसे प्रगतिशील खेला जा सकता है, उदा। कि आपको इसे चलाने में सक्षम होने के लिए पूरी फ़ाइल की आवश्यकता नहीं है (लेकिन यह वैसे भी एक शर्त होगी)।

  1. डेटा डाउनलोड करने और उसे फ़ाइल में जोड़ने के लिए थ्रेड का उपयोग करें, और फ़ाइल को किसी अन्य थ्रेड से चलाएं। अब, यह आवश्यक है कि आप MPMoviePlayerController में EOF ईवेंट को संभाल सकें और तब तक खेल रोकें जब तक कि कैश फ़ाइल संलग्न नहीं हो जाती है और फिर उसी बिंदु के लिए फिर से शुरू होती है।

अभी तक मैंने लोगों को यह देखा है कि यह काम नहीं करता है क्योंकि MPMoviePlayerController EOF ईवेंट को संभाल नहीं सकता है। (इसे अभी तक मेरा स्वयं परीक्षण नहीं किया गया है) [Caching videos to disk after successful preload by MPMoviePlayerController

  1. फ़ाइल से खेल छोड़ें और स्थानीय HTTP सर्वर और उस से स्ट्रीम करें (स्थानीयहोस्ट पर)। यह भी परीक्षण नहीं किया जाता है। विचार यह है कि MPMoviePlayerController फ़ाइल को सीधे पढ़ने से सीधे HTTP स्ट्रीम से अनुपलब्ध डेटा की स्थिति को संभालेगा। डाउनसाइड यह हो सकता है कि यह कम कुशल है, लेकिन मुझे लगता है कि सीपीयू में मामूली वृद्धि हुई है। मुझे नहीं पता कि नेटवर्क इंटरफ़ेस इसे संभाल लेगा, लेकिन मुझे लगता है कि यह कोई मुद्दा नहीं है।

मैं इस उत्तर को विकी के रूप में छोड़ देता हूं, क्योंकि मेरे पास कोई समाधान समाधान नहीं है लेकिन मुझे भी एक चाहिए।

+2

किसी ने अभी तक यह कोशिश की है? क्या आपको सफलता मिली है? – calimarkus

+0

मैं अब इस दृष्टिकोण की कोशिश कर रहा हूं। ऐसा लगता है कि यह काम कर सकता है लेकिन अभी तक कोई भाग्य नहीं है। मैं इस परियोजना से 'HTTPAsyncDataResponse' के साथ CocoaHTTPServer का कांटा का उपयोग कर रहा हूं: https://github.com/nickhart/CocoaHTTPServer – vaughan

+0

क्या यह काम करता है? मैंने इस स्रोत को डाउनलोड किया लेकिन नहीं कर सका – Bkillnest

1

आईफोन प्रगतिशील डाउनलोड का उपयोग कर रहा है ताकि यह डिवाइस पर सहेज न सके। इसके लिए आपको इसे स्पष्ट रूप से डाउनलोड करने की आवश्यकता है और फिर अपने स्थानीय फ़ोल्डर से वीडियो चलाएं।

2

इस काम को करने का एक तरीका है, लेकिन आपको अपना स्वयं का HTTP लाइव स्ट्रीमिंग डाउनलोडर लिखना है।

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

फिर आपको MPMoviePlayerController या AVPlayer को HTTP पर फ़ाइलों तक पहुंचने के लिए स्थानीय HTTP सर्वर सेट अप करना होगा (क्योंकि वे नहीं करेंगे स्थानीय फाइल पथ को स्पर्श करें), जिसमें स्थानीय फाइलों को इंगित करने वाली पुन: कोडित प्लेलिस्ट फ़ाइल शामिल है, जिसे आपको मूल प्लेलिस्ट से स्वयं बनाना होगा। CocoaHTTPServer इसके लिए बहुत अच्छा काम करता है।

एक बार जब आप यह सब कर लेंगे, तो यह बहुत अच्छा काम करता है। यह अपरिहार्य है कि जब आप मूवी प्लेयर में अपना स्थानीय HTTP यूआरएल पेश करने से पहले पहले खंड या दो डाउनलोड करते हैं तो आपको थोड़ा विलंब मिलता है, लेकिन इसके बाद आपको सीमलेस डाउनलोड, रिकॉर्डिंग और प्लेबैक का पूर्वावलोकन मिलता है।

शुभकामनाएं!

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