IOSフォトから収集したPHAsset
のビデオを再生したい。 PHAsset
ビデオnsurl
( https://stackoverflow.com/a/35099857/1084174 )は自分のアプリケーションで有効ですMyPlayer
for少しの瞬間/ブロック。画像/動画を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()
}
})
}
Swift 3の@Sazzad Hissain Khan解法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()
}
}
}
以下の解決策はスローモーションビデオでも機能します。
func playVideo(asset: PHAsset) {
guard asset.mediaType == .video else {
// Handle if the asset is not a video.
return
}
let options = PHVideoRequestOptions()
options.isNetworkAccessAllowed = true
PHCachingImageManager().requestPlayerItem(forVideo: asset, options: options) { (playerItem, info) in
DispatchQueue.main.async {
let playerViewController = AVPlayerViewController()
playerViewController.player = AVPlayer(playerItem: playerItem)
present(playerViewController, animated: true) {
playerViewController.player?.play()
}
}
}
}