我想播放PHAsset
中的视频,该视频是从iOS照片收集的。 PHAsset
视频nsurl
(https://stackoverflow.com/a/35099857/1084174)对我自己的应用程序有效,请说MyPlayer
片刻/一段。当我仅将图像/视频复制到MyPlayers
自己的沙箱中时,nsurl
始终有效。在我看来,
我需要将每个视频从临时
PHAsset
nsurl复制到MyPlayers沙箱(appgroup / documents),只有这样我才能播放视频沙箱相对nsurl。
如果是这种情况,所有其他播放器如何动态播放长视频?如果还有其他方法可以播放视频而不将其复制到应用程序沙箱中,请让我知道。
经过几天的实验终于找到了解决方法,
import AVKit
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()
}
})
})
}
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 Khan在Swift 3中的解决方案:
来自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()
}
}
}