2017-11-03 15 views
0

여기에있는 비디오로 어셈블되는 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를 사용하여 카메라 롤에 저장할 비디오를 만들면 완전히 곤란합니다.

답변

0

그래서 마침내 비디오가 정지 이미지에서 비디오를 만들려고하는 방식에 잘못이 있다는 것을 알아 냈습니다. 비디오가 너무 컸고 (해상도) 나에게 모호한 "-1"오류가 나타났습니다. 절약. 흥미롭게도 비디오를 제작하고 그것이 존재했다고 말할 수있었습니다. 내가 충돌을 일으킬 수 있었던 유일한 방법은 막연한 각 프레임에 비디오 효과를 적용하는 것이 었습니다 - Xcode에서 장치 오류에 대한 "연결이 끊어졌습니다"!

이 잘 작동 :

PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: self.fileURL) 

내가 큰 고해상도 및 이상 비디오 메모리에서 실행하지 않고 프레임을 조립하는 더 좋은 방법을 파악해야합니다.