如何在 iOS 中播放视频 PHAsset?
How to Play Videos PHAsset in iOS?
我想播放来自 PHAsset
的视频,这些视频是从 iOS 照片中收集的。 PHAsset
视频 nsurl
() 对我自己的应用程序有效让我们说 MyPlayer
对几个 moments/blocks。当我将 image/video 复制到 MyPlayers
自己的沙箱时,只有 nsurl
才会始终有效。在我看来,
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.
如果是这种情况,所有其他播放器如何即时播放长视频?如果有其他不复制到apps沙盒播放视频的方法,请告诉我方法。
经过几天的实验终于找到了解决办法,
导入文件
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()
}
})
}
@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()
}
}
}
以下解决方案也适用于慢动作视频。
func playVideo(asset: PHAsset) {
guard asset.mediaType == .video else {
// Handle if the asset is not a video.
return
}
let options = PHVideoRequestOptions()
options.isNetworkAccessAllowed = true
PHCachingImageManager().requestPlayerItem(forVideo: asset, options: options) { (playerItem, info) in
DispatchQueue.main.async {
let playerViewController = AVPlayerViewController()
playerViewController.player = AVPlayer(playerItem: playerItem)
present(playerViewController, animated: true) {
playerViewController.player?.play()
}
}
}
}
在Swift5
func playVideo(view:UIViewController, asset:PHAsset) {
guard (asset.mediaType == PHAssetMediaType.video)
else {
print("Not a valid video media type")
return
}
PHCachingImageManager().requestAVAsset(forVideo: asset, options: nil) { (assets, audioMix, info) in
let asset = assets 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()
}
}
}
}
我想播放来自 PHAsset
的视频,这些视频是从 iOS 照片中收集的。 PHAsset
视频 nsurl
() 对我自己的应用程序有效让我们说 MyPlayer
对几个 moments/blocks。当我将 image/video 复制到 MyPlayers
自己的沙箱时,只有 nsurl
才会始终有效。在我看来,
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.
如果是这种情况,所有其他播放器如何即时播放长视频?如果有其他不复制到apps沙盒播放视频的方法,请告诉我方法。
经过几天的实验终于找到了解决办法,
导入文件
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()
}
})
}
@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()
}
}
}
以下解决方案也适用于慢动作视频。
func playVideo(asset: PHAsset) {
guard asset.mediaType == .video else {
// Handle if the asset is not a video.
return
}
let options = PHVideoRequestOptions()
options.isNetworkAccessAllowed = true
PHCachingImageManager().requestPlayerItem(forVideo: asset, options: options) { (playerItem, info) in
DispatchQueue.main.async {
let playerViewController = AVPlayerViewController()
playerViewController.player = AVPlayer(playerItem: playerItem)
present(playerViewController, animated: true) {
playerViewController.player?.play()
}
}
}
}
在Swift5
func playVideo(view:UIViewController, asset:PHAsset) {
guard (asset.mediaType == PHAssetMediaType.video)
else {
print("Not a valid video media type")
return
}
PHCachingImageManager().requestAVAsset(forVideo: asset, options: nil) { (assets, audioMix, info) in
let asset = assets 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()
}
}
}
}