问题
I want to play video from PHAsset
, collected from iOS Photos. PHAsset
video nsurl
(https://stackoverflow.com/a/35099857/1084174) is valid to my own application lets say MyPlayer
for few moments/blocks. When I am copying the image/video into MyPlayers
own sandbox only then the nsurl
becomes always valid. It seems to me,
I need to copy each video from temporary
PHAsset
nsurl to MyPlayers sandbox (appgroup/documents) and only then I can play the video with sandbox relative nsurl.
If this is the case how do all other player play long videos on the fly? If there is any other way to play video without copying to apps sandbox, please let me know the way.
回答1:
After several days experiment finally I come upon a solution,
Import File
import AVKit
From 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()
}
})
})
}
From 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()
}
})
}
回答2:
@Sazzad Hissain Khan solution in Swift 3:
From 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()
}
}
}
}
From 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()
}
}
}
来源:https://stackoverflow.com/questions/39349949/swift-playing-videos-from-ios-phasset