Sazzad Hissain Khan Sazzad Hissain Khan - 2 months ago 20
iOS Question

Swift - Playing Videos from iOS PHAsset

I want to play video from

PHAsset
, collected from iOS Photos.
PHAsset
video
nsurl
(http://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.


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.

Answer

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