여기에있는 비디오로 어셈블되는 Swift 클래스를 사용하고 있습니다. https://stackoverflow.com/a/41159403AVAssetWriter를 사용하여 Swift 3의 카메라 롤에 비디오를 기록하는 방법은 무엇입니까?
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은) - 코코아 오류 -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를 사용하여 카메라 롤에 저장할 비디오를 만들면 완전히 곤란합니다.