Swift – Playing Videos from iOS PHAsset

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.

  • Swift: How can you rotate text for UIButton and UILabel?
  • hiding keyboard ios
  • UIDatePicker in count down timer mode not supporting resizing?
  • Terminating app due to uncaught exception 'NSRangeException', reason: 'Cannot remove an observer - ios
  • How to detect iOS 6 and all minor versions by user agent?
  • UICollectionView cellForItemAtIndexPath not registering cell
  • 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.

    2 Solutions Collect From Internet About “Swift – Playing Videos from iOS PHAsset”

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

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