2015-12-19 63 views
1

我正在使用自定義圖像/視頻選取器來選取時間間隔,一旦選取器視圖被解除了我想播放UIView中的時間間隔,到界面構建器中的視圖控制器。我目前使用的這段代碼在下面,但問題是,在選擇時間延遲的時候,它不會播放。使用AVPlayer播放UIView中的時間間隔

查看插座和VAR的視頻播放器

@IBOutlet var videoView: UIView! 
let ipc = QBImagePickerController() 
var playerItem: AVPlayerItem? 
var videoPlayer: AVPlayer? 
var playerLayer: AVPlayerLayer? 

沒有完成採摘資產碼

func qb_imagePickerController(imagePickerController: QBImagePickerController, didFinishPickingAssets assets: [AnyObject]) { 
    for asset in assets as! [PHAsset] { 
     PHImageManager.defaultManager().requestAVAssetForVideo(asset, options: nil, resultHandler: {(avAsset: AVAsset?, audioMix: AVAudioMix?, info: [NSObject : AnyObject]?) -> Void in 
      self.playerItem = AVPlayerItem(asset: avAsset!) 
      self.videoPlayer = AVPlayer(playerItem: self.playerItem!) 
      self.playerLayer = AVPlayerLayer(player: self.videoPlayer) 
      self.playerLayer!.frame = self.videoView.bounds 
     }) 
    } 
    self.dismissViewControllerAnimated(true, completion: { self.play() }) 
} 

play()函數的代碼

func play(){ 

    videoPlayer!.play() 
} 

意外發現零展開一個可選值 enter image description here

回答

2

我真的不知道你正在使用的庫時,但它似乎有結束塊。這些都在後臺線程中運行。

實際上有一個問題:在變量(玩家,物品等)被分配之前,你關閉了你的視圖控制器。

假設你是新來的斯威夫特我要詳細,你如何你的代碼的行爲在運行時:

•功能由代表呼籲當你的用戶選擇一個照片

•視圖控制器開除,播放器開始播放

•然後你的for循環中運行,並且玩家被分配一個項目打(太遲)

要實現的是分配的項目玩,然後解僱什麼VC。由於UI代碼只能在前臺運行(主線程),所以不能只在完成塊中移動解除函數,但是一旦for循環完成,您需要使用Grand Central Dispatch在主線程中運行代碼。

我建議你在GitHub中下載Async library,它是GCD的一個包裝(一旦下載,瀏覽到Sources文件夾並拖動Xcode項目中的Async.swift文件)。

那麼你將要編輯的「去把採摘資產」功能,這一點是爲了播放視頻:

func qb_imagePickerController(imagePickerController: QBImagePickerController, didFinishPickingAssets assets: [AnyObject]) { 

     let photoAssets = assets as! [PHAsset] 

     PHImageManager.defaultManager().requestAVAssetForVideo(photoAssets[0], options: nil, resultHandler: {(avAsset: AVAsset?, audioMix: AVAudioMix?, info: [NSObject : AnyObject]?) -> Void in 

      self.playerItem = AVPlayerItem(asset: avAsset!) 
      self.videoPlayer = AVPlayer(playerItem: self.playerItem!) 
      self.playerLayer = AVPlayerLayer(player: self.videoPlayer) 
      self.playerLayer!.frame = self.videoView.bounds 

      Async.main { self.dismissViewControllerAnimated(true, completion: { self.play() }) } 

     }) 

} 

BTW我刪除了for循環怎麼我想通了,你只是不願意選擇數組中的第一個資產。 (如果錯了告訴我!)

去嘗試了這一點,並告訴我,如果它的工作原理

(更多關於GCD here!)

+0

我沒有時間,現在測試了這一點,但是這看起來很完美。對於for循環你也是對的。非常感謝!! –

+0

我剛剛嘗試了這一點,但它仍然無法正常工作,無論是應用程序崩潰和控制檯意外地發現沒有包裝可選值時發現零或根本沒有任何反應。有任何想法嗎? –

+0

您能否重現問題並將內存堆棧發送給我? (讓應用程序崩潰,然後在調試窗格中選擇方法,然後在控制檯的左窗格中告訴我哪個變量等於零) –

相關問題