【问题标题】:What to do for Video PHAssets如何处理视频 PHAsset
【发布时间】:2015-08-31 15:15:29
【问题描述】:

我看到对于 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?

【问题讨论】:

    标签: swift phasset


    【解决方案1】:

    文档尚未针对 iOS 9 进行更新(我认为还没有)。但是,如果您查看 Xcode 中的 PHContentEditingInput.h 标头(或生成的 Swift 接口),您会发现它只是一个重命名——avAsset 已被弃用,取而代之的是 audiovisualAsset。它仍然返回一个AVAsset 对象,然后您可以使用 AVFoundation 对其进行处理。

    【讨论】:

      【解决方案2】:

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

      我想这取决于您所说的“过程”是什么意思,但通常您应该使用 AVFoundation。

      【讨论】:

      • 哦等等...他们是否从照片框架中删除了视频并为它们提供了一个全新的框架?通过过程,我的意思是你以前可以用 avAsset 做的任何事情。我刚开始,所以我不太确定我需要什么。
      • 您可能不会在这种情况下使用 PHContentEditingInput。它用于编辑照片,尤其是在照片扩展中。
      • 所以目前我正在遍历我的资产,其中一些恰好是视频......这些目前存储为 PHAsset。如何在不使用该方法的情况下让它们成为 AVURLAssets?
      • 我怀疑这与新的 PHAssetResource 类有关,但我还没有看过关于这个主题的新 WWDC 视频,文档也没有更新,所以这只是一个猜测。
      【解决方案3】:

      您要从 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
      

      我相信不止这两个,但从这里开始。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-01-13
          • 2015-11-07
          • 1970-01-01
          • 2018-02-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多