【问题标题】:Photos framework image from video at a certain frame照片框架图像来自特定帧的视频
【发布时间】:2015-11-26 09:19:43
【问题描述】:

我已经制作了一个库集合视图,其中填充了我从照片框架中获取的视频,我使用缩略图通过以下方法显示所有不同的视频

func requestImageForAsset(_ asset: PHAsset!, targetSize targetSize: CGSize, contentMode contentMode: PHImageContentMode, options options: PHImageRequestOptions!, resultHandler resultHandler: ((UIImage!, [NSObject : AnyObject]!) -> Void)!) -> PHImageRequestID

效果很好。 但是我的视频总是以黑框开头,所以所有的缩略图都是黑色的。我可以偏移拍摄快照图像的帧吗?

【问题讨论】:

    标签: ios objective-c swift video photos


    【解决方案1】:

    这是我在项目中使用的代码,对我来说就像一个魅力

    func generateThumnail(url: URL) -> UIImage? {
        let asset = AVAsset(url: url)
        let assetImgGenerate = AVAssetImageGenerator(asset: asset)
        assetImgGenerate.appliesPreferredTrackTransform = true
        assetImgGenerate.maximumSize = CGSize(width: 100, height: 100)
        let time = CMTimeMake(1, 30)
    
        if let img = try? assetImgGenerate.copyCGImage(at: time, actualTime: nil) {
            return UIImage(cgImage: img)
        }
        return nil
    }
    

    上述函数将返回视频 1 秒时的图像

    这是通过你的视频的assetUrl获取缩略图的方式

    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) {
    
        let mediaType = info[UIImagePickerControllerMediaType] as! String
        if (mediaType == kUTTypeMovie as! String){
            let tempVideo = info[UIImagePickerControllerMediaURL] as! URL
            if let thumbnail = self.generateThumbnail(url: tempVideo) {
                // Use your thumbnail
            }
    

    【讨论】:

      【解决方案2】:

      您可以使用

      获取关联的AVAsset 对象
      func requestAVAssetForVideo(_ asset: PHAsset,
                      options options: PHVideoRequestOptions?,
                resultHandler resultHandler: (AVAsset?,
                                       AVAudioMix?,
                    [NSObject : AnyObject]?) -> Void) -> PHImageRequestID
      

      然后将该资源加载到AVAssetImageGenerator 中,该AVAssetImageGenerator 能够通过

      获取特定时间的缩略图
      func copyCGImageAtTime(_ requestedTime: CMTime,
              actualTime actualTime: UnsafeMutablePointer<CMTime>,
                   error outError: NSErrorPointer) -> CGImage!
      

      【讨论】:

        【解决方案3】:

        我认为您需要查看 AVFoundation 库来解码视频并自己获取所需的帧。

        要更新库中查看文档的占位符,您似乎需要创建一个PHAssetChangeRequest 并在其上设置placeholderForCreatedAsset 属性。然后您需要请求由库在更改块中执行更改。

        注意:如果这仅供您使用,您可以在照片中设置占位符框架,这应该反映在您的应用中。

        【讨论】:

          猜你喜欢
          • 2020-03-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-30
          • 1970-01-01
          相关资源
          最近更新 更多