2016-01-26 6 views
7

मैं उपयोगकर्ताओं को वीडियो के माध्यम से चक्र करने में सक्षम होने की कोशिश कर रहा हूं, दृश्य को रीफ्रेश किए बिना एवीप्लेयर यूआरएल को फ्लाई पर बदल रहा हूं। हालांकि, अभी मैं एक बार वीडियो चलाए जाने पर AVPlayer ऑब्जेक्ट्स को तुरंत चालू कर रहा हूं (जिसके परिणामस्वरूप ऑडियो एक दूसरे पर खेला जा सकता है), जो मुझे लगता है कि ऐसा करने का सबसे अच्छा तरीका नहीं है। क्या छवि दृश्य में छवि को बदलने के समान ही एक और अधिक प्रभावी तरीका है? , गीत नामों की एक tableViewनया एवीप्लेयर ऑब्जेक्ट बनाने के बिना नए यूआरएल से वीडियो चलाएं

player = AVPlayer(URL: fileURL) 
playerLayer = AVPlayerLayer(player: player) 
playerLayer!.frame = self.view.bounds 
self.view.layer.addSublayer(playerLayer!) 
player!.play() 

उत्तर

0

मैं पूरा करने के लिए ऐसा करने से आप के लिए क्या देख रहे सक्षम हूँ ...

मेरे पास है के लिए:

इस कोड को जहाँ मैं क्लिप खेलने है जो एमपी 3 फाइलें Parse.com पर संग्रहीत हैं। didSelectRowAtIndexPath में मुझे क्या करना ...

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

    SelectedSongNumber = indexPath.row 
    grabSong() 
} 


    func grabSong() { 

    let songQuery = PFQuery(className: "Songs") 
    songQuery.getObjectInBackgroundWithId(iDArray[SelectedSongNumber], block: { 
     (object: PFObject?, error : NSError?) -> Void in 


     if let audioFile = object?["SongFile"] as? PFFile { 
      let audioFileUrlString: String = audioFile.url! 
      let audioFileUrl = NSURL(string: audioFileUrlString)! 

      myAVPlayer = AVPlayer(URL: audioFileUrl) 
      myAVPlayer.play() 

      currentUser?.setObject(audioFileUrlString, forKey: "CurrentSongURL") 
      currentUser?.saveInBackground() 
     } 
    }) 
} 

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

+0

जैसा कि मैंने कहा था, बनाने के बाद AVPlayer ऑब्जेक्ट तक नहीं पहुंचें; बल्कि, केवल अपने वर्तमान इटैम के साथ काम करते हैं। –

+0

@ जेम्सबुश वास्तव में आपका एक बेहतर तरीका है। एक और विकल्प AVQueuePlayer का उपयोग करना है, सभी संभावित यूआरएल को एक AVPlayerItems सरणी जोड़ें और फिर उस सरणी को कतार में डालें और फ्लाई पर सरणी को फिर से ऑर्डर करें। यह अगले वीडियो को बफरिंग शुरू करने की अनुमति देगा जबकि पिछला वीडियो अभी भी – MikeG

+0

या [self.player prerollAtRate: 1.0 completHandler:^(BOOL समाप्त हुआ) { [self.player play]; [self.player setRate: 1।0]; }]; –

3

AVPlayerItem का उपयोग AVPlayer ऑब्जेक्ट में आउटपुट जोड़ने और निकालने के लिए करें।

जब आप इसे बनाते हैं तो एवीप्लेयर को वीडियो जोड़ने के बजाय, एक खाली AVPlayer इंस्टेंस बनाएं, और फिर वीडियो जोड़ने के लिए AVPlayerItem क्लास की addOutput विधि का उपयोग करें।

वीडियो को निकालने और एक नया जोड़ने के लिए, पुराने वीडियो को हटाने के लिए AVPlayerItem क्लास के निकालें आउटपुट विधि का उपयोग करें, और उसके बाद नया एक डालने के लिए addOutput विधि का उपयोग करें।

नमूना कोड ऐप्पल की डेवलपर साइट से उपलब्ध है;

https://developer.apple.com/library/prerelease/content/samplecode/AVBasicVideoOutput/Introduction/Intro.html

यह एक ही बात मैं करूंगा प्रदान करता है, मैं अपने ही के कोड पोस्ट करने के लिए थे।

+0

धन्यवाद, क्या मुझे AVAsset का उपयोग करना होगा? – cb428

+0

मैं पूछता हूं क्योंकि मैं AVPlayerItem को URL या AVAsset के बिना तुरंत चालू नहीं कर सकता। मैं viewDidLoad में fileURL चर का उपयोग करने में सक्षम नहीं होगा जहां मैं AVPlayer सेट अप करूंगा। – cb428

+0

@ जेम्स बुश क्या आप कुछ कोड दिखा सकते हैं? – George

12

AVPlayer का उपयोग न करें।

इसके बजाय AVQueuePlayer का उपयोग करें जो आपको कतार से वस्तुओं को सम्मिलित करने और निकालने की अनुमति देता है।

//create local player in setup methods 
self.localPlayer = AVQueuePlayer.init() 

आप बस

//optional: clear current queue if playing straight away 
self.localPlayer.removeAllItems() 

//get url of track 
let url : URL? = URL.init(string: "http://urlOfItem") 
if url != nil { 
    let playerItem = AVPlayerItem.init(url: url!) 

    //you can use the after property to insert 
    //it at a specific location or leave it nil 
    self.localPlayer.insert(playerItem, after: nil) 
    self.localPlayer.play() 
} 

AVQueuePlayerAVPlayer की कार्यक्षमता के सभी का समर्थन करता है लेकिन जोड़ने और एक कतार से आइटम निकालने का जोड़ा कार्यक्षमता है उपयोग कर सकते हैं आइटम जोड़ने के लिए।

+0

है, आपने मेरा दिन बचाया है। बहुत बहुत धन्यवाद। –

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