2014-11-28 2 views
-1

iOS 기본 SDK가 8.1입니다. dispatch_get_main_queue은 8.1 시뮬레이터에서 실행될 때 잘 동작합니다. 그러나 7.1 시뮬레이터에서 실행하면 호출되지 않습니다. 나는 dispatch_get_main_queue이 iOS 8.0 이상에서 재 구현되었다.dispatch_get_main_queue가 작동하지 않습니다.

이 문제를 어떻게 해결할 수 있습니까? 기본 SDK 또는 무엇을 변경합니까?

AVMutableComposition *mixComposition = [[AVMutableComposition alloc] init]; 

    // audio track 
    AVMutableCompositionTrack *audioTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio 
                     preferredTrackID:kCMPersistentTrackID_Invalid]; 
    // 
    NSError *error; 

    AVAsset *videoAsset = [AVAsset assetWithURL:videoURL]; 
    [audioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoAsset.duration) 
         ofTrack:[[videoAsset tracksWithMediaType:AVMediaTypeAudio] firstObject] 
         atTime:kCMTimeZero 
          error:&error]; 
    if (error) { 
     NSLog(@"extract audio error!"); 
     return; 
    } 
    error = nil; 

    // audio path 
    NSString *path = [NSString stringWithFormat:@"%@newAudio.m4a", NSTemporaryDirectory()]; 
    if ([[NSFileManager defaultManager] fileExistsAtPath:path]) { 
     if (![[NSFileManager defaultManager] removeItemAtPath:path error:&error]) { 
      NSLog(@"audio cannot be saved!"); 
     } 
    } 
    // exporter 
    AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset:mixComposition 
                     presetName:AVAssetExportPresetAppleM4A]; 
    exporter.outputURL = [NSURL fileURLWithPath:path]; 
    exporter.outputFileType = AVFileTypeAppleM4A; 
    exporter.shouldOptimizeForNetworkUse = YES; 
    [exporter exportAsynchronouslyWithCompletionHandler:^{ 
     //NSLog(@"export status: %ld", exporter.status); 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [self exportDidFinish:exporter]; 
     }); 
    }]; 
} 
+0

현재 수행중인 작업을 보여주는 샘플 코드가 있습니까? 나는 iOS 7에서했던 것과 같은 방식으로 iOS 8에서'dispatch_get_main_queue'를 사용 해왔고 지금까지 어떤 문제도 경험하지 못했습니다. –

+0

@Kai [수출 업체 exportAsynchronouslyWithCompletionHandler :^{ dispatch_async (dispatch_get_main_queue(),^{[자기 exportDidFinish : 수출 업체], }); }]]; – CancerKnight

+0

iOS 7.1 시뮬레이터에서 해당 라인을 실행하지 않는다는 것을 확인하기 위해'[self exportDidFinish : exporter];'에 중단 점을 이미 설정 했습니까? 테스트를 위해 예제를 별도의 줄로 분리해야합니다. 그다지 도움이되지 않으면,'status'와'error '에 대해 ('exportAsynchronouslyWithCompletionHandler :'] (http://goo.gl/hxbmMI) 문서에 제시된 것과 같이 일부 KVO 코드를 추가하는 것이 좋습니다. 어떤 이유로 수출이 완료되지 않았는지 확인하십시오. –

답변

0

내 코드는 마지막으로 나는 그것을 알아 냈어. iOS 7 시뮬레이터에서 잘 작동하도록 presetName은 AVAssetExportPresetPassthrough 여야합니다. 왜 그런지 모르겠지만 답장을 위해 @ 카이와 @Rob에 감사드립니다.

관련 문제