Swift – 从iOS PHAsset播放video

我想从PHAsset播放来自iOS照片的video。 PHAssetvideonsurl ( https://stackoverflow.com/a/35099857/1084174 )是有效的我自己的应用程序可以说MyPlayer的片刻/块。 当我将图像/video复制到MyPlayers自己的沙盒中时, nsurl总是有效的。 在我看来,

我需要将每个video从临时PHAsset复制到MyPlayers沙盒(appgroup / documents),然后才能使用沙盒相关nsurl播放video。

如果是这样,所有其他玩家如何在飞行中播放长video? 如果有其他方式播放video而不复制到应用程序沙盒,请让我知道的方式。

经过几天的试验,终于find了解决办法,

导入文件

 import AVKit 

来自PHAsset

 static func playVideo (view:UIViewController, asset:PHAsset) { guard (asset.mediaType == PHAssetMediaType.Video) else { print("Not a valid video media type") return } PHCachingImageManager().requestAVAssetForVideo(asset, options: nil, resultHandler: {(asset: AVAsset?, audioMix: AVAudioMix?, info: [NSObject : AnyObject]?) in let asset = asset as! AVURLAsset dispatch_async(dispatch_get_main_queue(), { let player = AVPlayer(URL: asset.URL) let playerViewController = AVPlayerViewController() playerViewController.player = player view.presentViewController(playerViewController, animated: true) { playerViewController.player!.play() } }) }) } 

从AppLocalUrl

 static func playVideo (view:UIViewController, appLocalUrl:NSURL) { dispatch_async(dispatch_get_main_queue(), { let player = AVPlayer(URL: appLocalUrl) let playerViewController = AVPlayerViewController() playerViewController.player = player view.presentViewController(playerViewController, animated: true) { playerViewController.player!.play() } }) } 

@Sazzad Hissain汗在Swift 3中的解决scheme:

来自PHAsset:

 func playVideo (view: UIViewController, videoAsset: PHAsset) { guard (videoAsset.mediaType == .video) else { print("Not a valid video media type") return } PHCachingImageManager().requestAVAsset(forVideo: videoAsset, options: nil) { (asset, audioMix, args) in let asset = asset as! AVURLAsset DispatchQueue.main.async { let player = AVPlayer(url: asset.url) let playerViewController = AVPlayerViewController() playerViewController.player = player view.present(playerViewController, animated: true) { playerViewController.player!.play() } } } } 

从AppLocalUrl:

 func playVideo (view: UIViewController, appLocalUrl: URL) { DispatchQueue.main.async { let player = AVPlayer(url: appLocalUrl) let playerViewController = AVPlayerViewController() playerViewController.player = player view.present(playerViewController, animated: true) { playerViewController.player!.play() } } }