使用AVPlayer在UIView

时间:2015-12-19 12:17:03

标签: ios swift uiview avplayer avplayerlayer

我正在使用自定义图像/视频选择器来选择时间流逝,一旦选择器视图被解除,我想在UIView中播放我已经在界面构建器中添加到视图控制器的时间间隔。我目前的代码如下,但问题是,当选择时间流逝时,它不会被播放。

查看视频播放器的插座和广告

@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() })
}

播放()功能代码

func play(){

    videoPlayer!.play()
}

在展开可选值时意外发现nil enter image description here

1 个答案:

答案 0 :(得分:2)

我真的不知道您正在使用的库,但它似乎有完成块。这些是在后台线程中运行的。

实际上存在一个问题:在分配变量(播放器,项目等)之前,你会关闭视图控制器。

假设您是Swift的新手,我将详细介绍您的代码在运行时的行为:

•当您的用户选择照片时,代理人会调用该功能

•视图控制器被关闭,播放器开始播放

•然后你的for循环运行并为玩家分配了一个项目(太晚了)

您想要实现的是分配要播放的项目然后关闭VC。由于UI代码只能在前台运行(主线程),因此您不能只在完成块中移动dismiss函数,但是您需要使用Grand Central Dispatch在主线程中运行一次for循环完成。< / p>

我建议你下载GitHub中的Async library,它是GCD的一个包装器(一旦下载浏览到Sources文件夹并在你的Xcode项目中拖动Async.swift文件)。

然后你会想要编辑&#34;完成选择资产&#34;为了播放你的视频而对此起作用:

   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-loop coz我发现你只是愿意选择阵列中的第一个资产。 (如果错误告诉我!)

去尝试一下并告诉我它是否有效

(更多关于GCD here!)