2014-10-02 12 views
15

प्रारंभ करते समय ब्लैक स्क्रीन की बजाय रोके गए वीडियो को कैसे दिखाएं मैं सफलतापूर्वक एक खिलाड़ी बनाने में सक्षम हूं लेकिन प्रारंभिक ब्लैक स्क्रीन से नाराज था। मैंने एक UIImageView ओवरले करने का फैसला किया और प्लेयर शुरू होने के बाद इसे छुपाया। यह काम करता था, लेकिन मैं अपने सभी वीडियो के लिए छवियों को बनाने और बनाए रखने की परेशानी नहीं चाहता था।AVPlayer

मैं सटीक परिणाम प्राप्त करने में सक्षम था जो मैं खेलना चाहता था और इसे तुरंत चालू करने के बाद खिलाड़ी को रोक रहा था। एकमात्र मुद्दा यह था कि कभी-कभी खिलाड़ी की स्थिति गलत तरीके से दर्ज की जा रही थी, इसलिए जब मैं खिलाड़ी को फिर से शुरू करने गया, तो स्थिति को रोक दिया गया था, भले ही स्थिति को पहले से ही "खेलना" के रूप में सूचीबद्ध किया गया था।

मैं AVPlayerItem seekToTime का उपयोग करना शुरू कर रहा हूं लेकिन मुझे कोई व्यवहार्य समाधान नहीं मिला है। क्या यह हासिल करने का कोई "गैर हैकी" तरीका है?

+1

@ क्रिस: http://stackoverflow.com/questions/15360721/create-a- थंबनेल- या-image-of-an-avplayer-at-current-time? – Larme

+1

मुझे लगता है कि लिंक लार्मे का उल्लेख आपको सही दिशा देगा। ऑन-डिमांड पर एक थंबनेल बनाएं, और ओवरले करें कि आपके प्लेयर (शायद एक प्ले बटन) के शीर्ष पर, और इस तरह आपको तुरंत – Stephenye

+1

खेलना और रोकना नहीं है प्रोजेक्ट में मुझे बनाना होगा कि मुझे नए वीडियो की आवश्यकता है ब्लैक स्क्रीन और न ही थंबनेल छवियों के बिना दूसरे के बाद खेला। ग्राहक ने मुझे पहले वीडियो से दूसरे स्थान पर जाने के लिए कहा जैसे कि दूसरा अगला फ्रेम था, बिना रुकावट के – Cris

उत्तर

8

यदि आप AVPlayerViewController का उपयोग कर रहे हैं, तो यह प्लेयर नियंत्रक की contentOverlayView संपत्ति का एकदम सही उपयोग है। इस खिलाड़ी परत और इस उद्देश्य के लिए वास्तव में उजागर नियंत्रण के बीच एक UIView है:

पहले, स्क्रीनशॉट बनाने:, अब

let asset = AVAsset(URL: URL(string: "")!) // link to some video 
let imageGenerator = AVAssetImageGenerator(asset: asset) 
let screenshotTime = CMTime(seconds: 1, preferredTimescale: 1) 
if let imageRef = try? imageGenerator.copyCGImageAtTime(screenshotTime, actualTime: nil) { 

    let image = UIImage(CGImage: imageRef) 

    // see part 2 below 
} 

खिलाड़ी नियंत्रक में contentOverlayView की एक subview के रूप में छवि जोड़ें:

// in the same try block 

let imageView = UIImageView(image: image) 
let playerVC = AVPlayerViewController() 
let playerItem = AVPlayerItem(asset: asset) 
playerVC.player = AVPlayer(playerItem: playerItem) 

self.presentViewController(playerVC, animated: true) { 
    playerVC.contentOverlayView?.addSubview(imageView) 
    // adjust the frame of your imageView to fit on the player controller's contentOverlayView 
} 

फिर, imageView subview को दूर जब खिलाड़ी संपत्ति खेलने, या जब कम्प्लिट्स बफरिंग शुरू होता है।

1

आपके प्लेयर से जुड़े AVPlayerLayer के पास एक फॉरडिस्प्ले प्रॉपर्टी है।

आप अपने होस्ट को इस मूल्य के लिए पर्यवेक्षक देखने का प्रयास कर सकते हैं, और जैसे ही यह सत्य पर सेट हो, ताज़ा करें।

यह पहला सेट है जब पहला फ्रेम प्रस्तुत करने के लिए तैयार है, इसलिए खिलाड़ी के पास पर्याप्त डेटा खेलने और सेट करने के लिए अपनी स्थिति सेट करने से पहले।