2014-02-11 3 views
5

두 개의 오디오 녹음 (AVAudioRecorder을 사용하여 녹음 됨)을 하나의 파일로 결합합니다. AVAssetExportSession을 사용하여 결합 된 파일을 내보낼 때 처음부터 완벽하게 작동합니다 (즉, 현재 뷰 컨트롤러에있는 동안) 그러나이 뷰를 다시로드하면 (새 세션) AVAssetExportSession exportAsynchronouslyWithCompletionHandler : 메소드가 전혀 호출되지 않습니다 다시 전화하지 않습니다!) 오류를 더 아무것도 ... 나는 AVAssetExportSession 개체를 기록했는데, 나는이를 처음AVAssetExportSession exportAsynchronouslyWithCompletionHandler : 메서드가 호출되지 않았습니다.

<AVAssetExportSession: 0x155b3250, asset = <AVMutableComposition: 0x156474c0 tracks = ("<AVMutableCompositionTrack: 0x156a0bb0 trackID = 1, mediaType = soun, editCount = 0>")>, presetName = AVAssetExportPresetAppleM4A, outputFileType = (null) 

이 두 번째 시간을 얻을

<AVAssetExportSession: 0x1559e840, asset = <AVMutableComposition: 0x155f7f30 tracks = ("<AVMutableCompositionTrack: 0x155f0120 trackID = 1, mediaType = soun, editCount = 1>")>, presetName = AVAssetExportPresetAppleM4A, outputFileType = (null) 

유일한 차이점은 editCount = 1 것입니다.

나는 그것이 혼란 스럽다는 것을 알고있다, 그것은 나에게있다. 여기서 뭐하고 있니?

내 코드 :

AVAssetExportSession* exportSession = [AVAssetExportSession 
             exportSessionWithAsset:composition 
             presetName:AVAssetExportPresetAppleM4A]; 

NSLog(@"exportSession: %@", exportSession); 


exportSession.outputURL = [NSURL fileURLWithPath:combined]; 
exportSession.outputFileType = AVFileTypeAppleM4A; 
exportSession.shouldOptimizeForNetworkUse = YES; 
[exportSession exportAsynchronouslyWithCompletionHandler:^{ 
    switch (exportSession.status) { 
     case AVAssetExportSessionStatusFailed: 
      NSLog(@"AVAssetExportSessionStatusFailed"); 
      break; 
     case AVAssetExportSessionStatusCompleted: 
      NSLog(@"AVAssetExportSessionStatusCompleted"); 
      break; 
     case AVAssetExportSessionStatusWaiting: 
      NSLog(@"AVAssetExportSessionStatusWaiting"); 
      break; 
     default: 
      break; 
    } 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self exportDidFinish:exportSession]; 
    }); 

}]; 
+0

editCount가 무엇인지 알아 냈습니까? – RSully

답변

0

그것은 작동이 제대로입니다.

[exportSession exportAsynchronouslyWithCompletionHandler:^{ 
    dispatch_async(dispatch_get_main_queue(), ^{ 

     switch (exportSession.status) 
     { 
       case AVAssetExportSessionStatusFailed: 
         NSLog(@"AVAssetExportSessionStatusFailed"); 
       break; 
       case AVAssetExportSessionStatusCompleted: 
         NSLog(@"AVAssetExportSessionStatusCompleted"); 
         [self exportDidFinish:exportSession]; 
       break; 
       case AVAssetExportSessionStatusWaiting: 
        NSLog(@"AVAssetExportSessionStatusWaiting"); 
       break; 
       default: 
       break; 
     } 
    }); 
}]; 
3

관련성이 있거나 다를 수는 있지만 비슷한 문제가 있습니다. 내보내기 세션에 AVAsset 시작 시간 및 기간에 대한 올바른 정보가 없으면 완료 블록이 실행되지 않습니다. 내가 찾은 유일한 대안은 각 자산을 컴포지션 트랙에 추가 할 때 약간의 시간 만 투자하는 것입니다 (CMTimeRangeMake()). 이상적이지 않습니다.

+0

고마워 .. 잘하고있어 ... – Thangavel

+0

내 비디오의 짧은 지속 시간이 필요합니다. 1 초 미만의 지속 시간. 어떻게 이것을 달성합니까? – Thangavel

관련 문제