Swift - Воспроизведение видео с iOS PHAsset

Я хочу воспроизвести видео из PHAsset, собранного из фотографий iOS. PHAsset video nsurl (qaru.site/info/148160/...) действителен для моего собственного приложения, скажем MyPlayer для нескольких моментов/блоков. Когда я копирую изображение/видео в MyPlayers собственную песочницу только тогда, nsurl становится всегда действительным. Мне кажется,

Мне нужно скопировать каждое видео из временного PHAsset nsurl в MyPlayers песочнице (appgroup/documents), и только тогда я могу воспроизвести видео с помощью песочница относительная nsurl.

Если это так, как все остальные игроки проигрывают длинные видео на лету? Если есть какой-либо другой способ воспроизведения видео без копирования в изолированную программную среду приложений, сообщите мне об этом.

Ответ 1

После нескольких дней эксперимента, наконец, я пришел к решению,

Файл импорта

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()
            }
        })
    }

Ответ 2

@Решение 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()
        }
    }
}