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.

  • Is it possible to play video using Avplayer in Background?
  • How can I determine file size on disk of a video PHAsset in iOS8
  • Swift Merge audio and video files into one video
  • Create CVPixelBuffer from YUV with IOSurface backed
  • iOS4: how do I use video file as an OpenGL texture?
  • Video Calling/Conference API for iPhone
  • 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()
            }
        }
    }