Swift - Playing Videos from iOS PHAsset

社会主义新天地 提交于 2019-12-31 12:35:12

问题


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.

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.


回答1:


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



回答2:


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


来源:https://stackoverflow.com/questions/39349949/swift-playing-videos-from-ios-phasset

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!