【问题标题】:How do you use AVAssetWriter to write a video to the camera roll in Swift 3?您如何使用 AVAssetWriter 在 Swift 3 中将视频写入相机胶卷?
【发布时间】:2018-04-16 16:08:40
【问题描述】:

我正在使用一个组装成视频的 Swift 类,可以在这里找到:https://stackoverflow.com/a/41159403

我制作了一个包含 70 个图像的数组。我之前通过将它们单独保存到相机胶卷来验证这些都很好,我已经注释掉了。

在方法调用movieMaker.createMovieFrom中有一个闭包,它创建了我注释掉的资​​产和播放器项目,因为我不需要在应用程序中播放视频,我只需要将它保存到我的相机卷。我不确定是否可以将渲染的视频保存在闭包中,或者是否应该在 CXEImagesToVideo 类中进行。

        var uiImages = [UIImage]()

        /** add image to uiImages */
        for _ in 0 ... 30 {
            uiImages.append(UIImage(cgImage: image.cgImage!))
        }

        let settings = CXEImagesToVideo.videoSettings(codec: AVVideoCodecH264, width: (uiImages[0].cgImage?.width)!, height: (uiImages[0].cgImage?.height)!)
        let movieMaker = CXEImagesToVideo(videoSettings: settings)
        movieMaker.createMovieFrom(images: uiImages){ (fileURL:URL) in
//              let video = AVAsset(url: fileURL)
//              let playerItem = AVPlayerItem(asset: video)
//              let player = CXEPlayer()
//              player.setPlayerItem(playerItem: playerItem)
}

我已经尝试将视频保存到封闭内的相机胶卷中:

1) PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: fileURL) - 返回 Cocoa 错误 -1

2) UISaveVideoAtPathToSavedPhotosAlbum(fileURL.path, nil, nil, nil) - 表示视频已保存,但我的相机胶卷中没有视频。

            PHPhotoLibrary.shared().performChanges({
                PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: fileURL)
                //UISaveVideoAtPathToSavedPhotosAlbum(fileURL.path, nil, nil, nil)

            }) { saved, error in
                if saved {
                    let alertController = UIAlertController(title: "Your video was successfully saved", message: nil, preferredStyle: .alert)
                    let defaultAction = UIAlertAction(title: "OK", style: .default, handler: nil)
                    alertController.addAction(defaultAction)
                    self.present(alertController, animated: true, completion: nil)
                }else{

                    print("Fetch failed: \(error!.localizedDescription)")

                }
            }

我还尝试了各种方法(包括闭包中的方法)将视频保存在 DispatchQueue.main.sync 中的 self.assetWriter.finishWriting 中的 CXEImagesToVideo 类中。我也尝试过创建资产并保存它,但它从未真正到达完成处理程序:

                let currentAsset = AVMutableComposition(url: self.fileURL)

                let exportPath = self.fileURL.path
                let exportURL = URL(fileURLWithPath: exportPath)

                let exporter = AVAssetExportSession(asset: currentAsset, presetName: AVAssetExportPresetHighestQuality)
                exporter?.outputURL = exportURL

                exporter?.exportAsynchronously(completionHandler: {
                    PHPhotoLibrary.shared().performChanges({
                        PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: exportURL)
                    }) { saved, error in
                        if saved {
                            print("Saved")
                        }else{

                            print("Fetch failed: \(error!.localizedDescription)")

                        }

                    }
                })

我可以通过在类的 newPixelBufferFrom 函数中打印消息来确认该类正在写入图像,并通过在 self.assetWriter.finishWriting 中打印一条消息来查看它是否已完成。

所以我已经处理了保存照片,但是使用 AVAssetWriter 创建视频以保存到相机胶卷,我完全被难住了。

【问题讨论】:

    标签: swift video swift3 avassetwriter camera-roll


    【解决方案1】:

    所以我终于发现,我尝试从静止图像制作视频的方式并没有什么问题,只是视频太大了,(分辨率)在保存时给我一个模糊的“-1”错误.有趣的是,它能够说它正在组装视频并且它确实存在。我能够让它崩溃的唯一方法是将我的视频效果应用于每个帧,这也是模糊的 - 它只是给了我一个“丢失连接”到 Xcode 中的设备错误!

    这很好用:

    PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: self.fileURL) 
    

    我必须想出一种更好的方法来组装帧,而不会耗尽内存以获取更大的分辨率和更长的视频。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-11
      • 1970-01-01
      • 2015-05-12
      • 2013-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-01
      相关资源
      最近更新 更多