-1

.MOV 비디오를 변환하는 중입니다. AVIIsetExportSession을 사용하여 UIImagePickerController에서 .mp4 형식으로 변환합니다. 변환이 완료되면 데이터를 서버로 보냅니다. 상태 표시 줄이 빨간색으로 변하고 전송이 완료되면 펄싱하는 것을 제외하면 모든 것이 잘 작동합니다. 앱을 백그라운드로두고 다시 열면 상태 표시 줄이 다시 정상 상태로 돌아갑니다.UIImagePickerController 미디어 변환을 위해 AVAssetExportSession을 사용하면 UIStatusBar가 빨간색이됩니다.

//I took a video 

    __block NSString *messageType; 
    __block NSData *messageData; 
    __block NSString *messageText; 

    [...] 

    NSURL *url = [info objectForKey:UIImagePickerControllerMediaURL]; 

    AVURLAsset *avAsset = [AVURLAsset URLAssetWithURL:url options:nil]; 
    NSArray *compatiblePresets = [AVAssetExportSession exportPresetsCompatibleWithAsset:avAsset]; 
    NSString *videoPath = nil; 
    if ([compatiblePresets containsObject:AVAssetExportPresetLowQuality]) 
    { 
     AVAssetExportSession *exportSession = [[AVAssetExportSession alloc]initWithAsset:avAsset presetName:AVAssetExportPresetPassthrough]; 

     videoPath = [[NSTemporaryDirectory() stringByAppendingPathComponent:videoDirectory]stringByAppendingPathComponent:tempVideoFileName]; 
     exportSession.outputURL = [NSURL fileURLWithPath:videoPath]; 
     NSLog(@"videopath of your mp4 file = %@",videoPath); // PATH OF YOUR .mp4 FILE 
     exportSession.outputFileType = AVFileTypeMPEG4; 

     [exportSession exportAsynchronouslyWithCompletionHandler:^{ 

      switch ([exportSession status]) { 

       case AVAssetExportSessionStatusFailed:{ 
        NSLog(@"Export failed: %@", [[exportSession error] localizedDescription]); 
        [picker dismissViewControllerAnimated:YES completion:^{ 
        [SVProgressHUD showErrorWithStatus:[[exportSession error] localizedDescription]]; 
        }]; 
       } 
        break; 

       case AVAssetExportSessionStatusCancelled: 

        NSLog(@"Export canceled"); 

        break; 

       case AVAssetExportSessionStatusCompleted:{ 

        messageData = [NSData dataWithContentsOfURL:[NSURL fileURLWithPath:videoPath]]; 
        messageText = videoPath; 
        messageType = kMessageTypeVideo; 

        // This method sends asynchronously the data to the server 
        [self sendMediaType:messageType MessageData:messageData MessageText:messageText]; 

        [picker dismissViewControllerAnimated:YES completion:NULL]; 

       } 

        break; 

       default: 

        break; 

      } 


     }]; 

    } 

내가 그것을 만들 때 사용하는 방식 빨간 상태 표시 줄의 또는 적어도 외관을 피할 수있는 방법이 있나요 :

내가이 문제를 일으키는 코드의 조각이 생각하는 것입니다 사라지다?

+0

을?! 얘들 아, 너 심각 할 수 없어! – Lolloz89

답변

0

어떤면에서 UIImagePickerController의 녹음 세션이 AVAssetExportSession과 충돌 했음이 밝혀졌습니다.

은 내가 UIImagePicker 컨트롤러 해산 한 후 비디오를 변환하여이 문제를 해결 : 주제 중

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{ 

NSString *mediaType = [info objectForKey: UIImagePickerControllerMediaType]; 
if (CFStringCompare ((__bridge_retained CFStringRef) mediaType, kUTTypeImage, 0) 
    == kCFCompareEqualTo) { 

    [....] 

} 
else{ 
    //Took a video 
    NSURL *url = [info objectForKey:UIImagePickerControllerMediaURL]; 

    [picker dismissViewControllerAnimated:YES completion:^{ 

     [self convertAndSendVideo:url]; 
    }]; 

} 

} 

-(void)convertAndSendVideo:(NSURL *)url{ 

__block NSString *messageType; 
__block NSData *messageData; 
__block NSString *messageText; 

AVURLAsset *avAsset = [AVURLAsset URLAssetWithURL:url options:nil]; 
NSArray *compatiblePresets = [AVAssetExportSession exportPresetsCompatibleWithAsset:avAsset]; 
NSString *videoPath = nil; 
if ([compatiblePresets containsObject:AVAssetExportPresetLowQuality]) 
{ 
    __block AVAssetExportSession *exportSession = [[AVAssetExportSession alloc]initWithAsset:avAsset presetName:AVAssetExportPresetPassthrough]; 

    videoPath = [[NSTemporaryDirectory() stringByAppendingPathComponent:videoDirectory]stringByAppendingPathComponent:tempVideoFileName]; 
    exportSession.outputURL = [NSURL fileURLWithPath:videoPath]; 
    NSLog(@"videopath of your mp4 file = %@",videoPath); // PATH OF YOUR .mp4 FILE 
    exportSession.outputFileType = AVFileTypeMPEG4; 

    [exportSession exportAsynchronouslyWithCompletionHandler:^{ 

     switch ([exportSession status]) { 

      case AVAssetExportSessionStatusFailed:{ 
       NSLog(@"Export failed: %@", [[exportSession error] localizedDescription]); 
       [SVProgressHUD showErrorWithStatus:[[exportSession error] localizedDescription]]; 
      } 
       break; 

      case AVAssetExportSessionStatusCancelled: 

       NSLog(@"Export canceled"); 

       break; 

      case AVAssetExportSessionStatusCompleted:{ 

       messageData = [NSData dataWithContentsOfURL:[NSURL fileURLWithPath:videoPath]]; 
       messageText = videoPath; 
       messageType = kMessageTypeVideo; 

       [self sendMediaType:messageType MessageData:messageData MessageText:messageText]; 

      } 

       break; 

      default: 

       break; 

     } 


    }]; 

} 

}