Swift – 从iOS PHAsset播放video
我想从PHAsset
播放来自iOS照片的video。 PHAsset
videonsurl
( 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() } } }