gpt4 book ai didi

swift - 在 Swift 3 中如何使用 AVAssetWriter 将视频写入相机胶卷?

转载 作者:行者123 更新时间:2023-11-30 12:02:01 29 4
gpt4 key购买 nike

我正在使用一个 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 类中。我也尝试过创建 Assets 并保存它,但它实际上从未到达完成处理程序:

                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 创建视频以保存到相机胶卷时,我完全被难住了。

最佳答案

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

这工作正常:

PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: self.fileURL) 

我必须找到一种更好的方法来组装帧,而不会耗尽较大分辨率和较长视频的内存。

关于swift - 在 Swift 3 中如何使用 AVAssetWriter 将视频写入相机胶卷?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47104022/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com