如何处理视频PHAssets

时间:2015-06-15 23:54:04

标签: swift phasset

我看到PHContentEditingInput(https://developer.apple.com/library/prerelease/ios/documentation/Photos/Reference/PHContentEditingInput_Class/index.html#//apple_ref/occ/instp/PHContentEditingInput/avAsset),视频资产的内容已被弃用。

如果我需要处理视频,我应该使用什么呢?

(特别是NSURL from PHAsset,他们在这里使用了这个已弃用的函数。还有其他我可以使用的东西不被弃用但可以获得NSURL吗?)

编辑:所以......在我读了一下AVFoundation框架后......我们究竟如何在不使用弃用方法的情况下将PHAsset转换为AVURLAsset?

4 个答案:

答案 0 :(得分:2)

iOS 9尚未更新文档(但我已假设)。但是,如果您查看Xcode中的PHContentEditingInput.h标题(或生成的Swift界面),您会发现它只是重命名 - avAsset已弃用,而不是audiovisualAsset。它仍然返回一个AVAsset对象,然后您可以使用AVFoundation进行处理。

答案 1 :(得分:0)

  

如果我需要处理视频,我应该使用什么

这取决于你的意思"进程",我想,但一般来说你应该使用AVFoundation。

答案 2 :(得分:0)

您从AVURLAsset对象中寻找什么类型的URL?有两种变体,区别总是相关的(例如,使用UIImagePickerController生成的URL与AVAssetReader / Writer使用的URL)。他们在这里:

[[PHImageManager defaultManager] requestAVAssetForVideo:phAsset options:nil resultHandler:^(AVAsset *avAsset, AVAudioMix *audioMix, NSDictionary *info) {
    NSURL *url = (NSURL *)[[(AVURLAsset *)avAsset URL] fileReferenceURL];
    NSLog(@"url = %@", [url absoluteString]);
    NSLog(@"url = %@", [url relativePath]);
 }];

虽然phAsset是PHAsset对象,而avAsset是由PHImageManager生成的结果AVAsset对象,但从上面的代码输出到控制台将产生,例如:

2016-04-16 01:15:40.155 ChromaEpsilon[3423:933358] url = file:///.file/id=16777218.8262005
2016-04-16 01:15:40.155 ChromaEpsilon[3423:933358] url = /private/var/mobile/Media/DCIM/108APPLE/IMG_8421.MOV

我相信,不仅仅是这两个,而是从这里开始。

答案 3 :(得分:0)

Swift 2.0

导入文件

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   // you are looking for

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