0

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

4

1 回答 1

1

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

这工作正常:

PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: self.fileURL) 

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

于 2017-11-07T21:45:15.903 回答