【发布时间】: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