2016-11-11 5 views
2

사용자의 사진 라이브러리에서 두 개의 비디오 자산을 병합하는 작은 장난감 iOS 앱을 만들려고합니다. AVMutableComposition 인스턴스를 사용하여 동영상을 병합 한 지점에 도달 했으므로 이제 컴포지션을 내 보내야합니다. 나는 다음과 같은 코드로 그렇게하고 있습니다 :PHAsset에서 AVAssetExportSession의 출력을 가져 오려고 시도 할 때 빈 결과 얻기

func saveEditedComposition(_ composition: AVMutableComposition) { 
    let documentDirectory = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] 
    let savePath = (documentDirectory as NSString).strings(byAppendingPaths: ["mergeVideo.mov"])[0] 
    let url = NSURL(fileURLWithPath: savePath) 

    // Set up exporter 
    guard let exporter = AVAssetExportSession(asset: composition, presetName: AVAssetExportPresetHighestQuality) else { return } 
    exporter.outputURL = url as URL 
    exporter.outputFileType = AVFileTypeQuickTimeMovie 
    exporter.shouldOptimizeForNetworkUse = true 

    // Perform the export 
    exporter.exportAsynchronously(completionHandler: {() -> Void in 
     // Upon completion of the export, 
     DispatchQueue.global().async { 
      if exporter.status == .completed { 
       let fetchResult = PHAsset.fetchAssets(withALAssetURLs: [exporter.outputURL!], options: nil)) 
       let phAsset = fetchResult.firstObject! // Crashes here, returning nil. 
      } 
     } 
    }) 
} 

문제입니다 completionHandler이 실행될 때, 나는 내 수출이 오류 (if exporter.status == .completed {)없이 완료 것을 볼 수 있어요,하지만 난 자산에 액세스하려고 할 때 exporter.outputURL에 빈 PHFetchResult<PHAsset>을 반환합니다. 아무도 내가 여기서 잘못하고있는 것을 볼 수 있습니까?

답변

1

비디오를 파일 시스템 (문서 디렉토리)으로 내보내고 있지만 카메라 롤/ALAssetsLibrary에서 가져 오는 중입니다.

내 보낸 파일로 수행해야하는 작업에 따라 다릅니다. 그것은 ALAssetsLibrary에있을 필요가 있다면, 당신은

ALAssetsLibrary().writeVideoAtPath(toSavedPhotosAlbum: exporter.outputURL!) { alAssetURL, error in  
} 

는 그러나 ALAssetsLibrary 지금은 사용되지 않으며 당신이 PHPhotoLibrary를 사용하기로되어 사용할 수 있습니다. 나는 사진 프레임 워크를 잘 모르겠지만, 나는 다음과 같이 작동 생각 : 카메라 롤에 살 수있는 영상이 필요하지 않은 경우

var placeHolder: PHObjectPlaceholder? 

PHPhotoLibrary.shared().performChanges({ 
    let changeRequest = PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: exporter.outputURL!) 
    if let changeRequest = changeRequest { 
     // maybe set date, location & favouriteness here? 
     placeHolder = changeRequest.placeholderForCreatedAsset 
    } 
}) { success, error in 
    placeHolder?.localIdentifier // should identify asset from now on? 
} 

, 다음 파일에서 직접 작업 할 수 있습니다 exporter.outputURL!.

+0

고마워요! 귀하의'PHPhotoLibrary' 코드가 그 일을했습니다. – azrosen92