如何在iOS中播放视频PHAsset?

问题描述 投票:16回答:2

我想播放PHAsset中的视频,该视频是从iOS照片收集的。 PHAsset视频nsurlhttps://stackoverflow.com/a/35099857/1084174)对我自己的应用程序有效,请说MyPlayer片刻/一段。当我仅将图像/视频复制到MyPlayers自己的沙箱中时,nsurl始终有效。在我看来,

我需要将每个视频从临时PHAsset nsurl复制到MyPlayers沙箱(appgroup / documents),只有这样我才能播放视频沙箱相对nsurl。

如果是这种情况,所有其他播放器如何动态播放长视频?如果还有其他方法可以播放视频而不将其复制到应用程序沙箱中,请让我知道。

ios swift video nsurl phasset
2个回答
20
投票

经过几天的实验终于找到了解决方法,

导入文件

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

5
投票

@@ 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()
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.