我正在使用一个组装成视频的 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 创建视频以保存到相机胶卷,我完全被难住了。