2015-02-02 3 views
0

저는 정말로이 문제에 집착하고 있습니다. (xcode에 저장된 mp4 종류와 사용자 사진 라이브러리의 mov) 오디오 (xcode에 저장된 mp3 종류)가 병합되었습니다. 시뮬레이터에서는 잘 작동하고 비디오 및 오디오를 보여 주지만 장치에서는 비디오가 사운드 만 재생한다는 것을 보여주지 않습니다. 여기에 병합을위한 코드가 있습니다 :`AVMutableComposition * mixComposition = [AVMutableComposition composition];비디오가 기기에서 재생되지 않지만 ov 시뮬레이터를 재생합니다.

//Audio 
//Now first load your audio file using AVURLAsset. Make sure you give the correct path of your videos. 
NSURL *audio_url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:_video.musicFileName ofType:@"mp3"]]; 
AVURLAsset *audioAsset = [[AVURLAsset alloc] initWithURL:audio_url options:nil]; 
CMTimeRange audio_timeRange = CMTimeRangeMake(kCMTimeZero, audioAsset.duration); 

//Now we are creating the first AVMutableCompositionTrack containing our audio and add it to our AVMutableComposition object. 
AVMutableCompositionTrack *compositionAudioTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; 
[compositionAudioTrack insertTimeRange:audio_timeRange ofTrack:[[audioAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] atTime:kCMTimeZero error:nil]; 


//Video 
AVMutableCompositionTrack *compositionVideoTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid]; 
NSString *fistPartMovieFilename = @"firstpart"; 
NSString *lastPartMovieFilename = @"lastpart"; 

//[_video.selectedVideosFileName insertObject:fistPartMovieFilename atIndex:0]; 
//[_video.selectedVideosFileName addObject:lastPartMovieFilename]; 
NSMutableArray *timeRanges = [NSMutableArray arrayWithCapacity:_video.selectedVideosFileName.count]; 
NSMutableArray *tracks = [NSMutableArray arrayWithCapacity:_video.selectedVideosFileName.count]; 

NSLog(@"_video.selectedVideosFileName %@",_video.selectedVideosFileName); 
for (int i=0; i<[_video.selectedVideosFileName count]; i++) 
{ 
    AVURLAsset *assetClip; 
    NSString *fileName = [_video.selectedVideosFileName objectAtIndex:i]; 

    if ([[_video.selectedVideosFileName objectAtIndex:i] isKindOfClass:[NSURL class]]) 
    { 
     assetClip = [AVAsset assetWithURL:[_video.selectedVideosFileName objectAtIndex:i]]; 
    } 
    else 
    { 
     assetClip = [AVURLAsset URLAssetWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:[NSString stringWithString:fileName] ofType:@"mp4"]] options:nil]; 

    } 

    AVAssetTrack *clipVideoTrack = [[assetClip tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]; 
    [timeRanges addObject:[NSValue valueWithCMTimeRange:CMTimeRangeMake(kCMTimeZero, assetClip.duration)]]; 
    [tracks addObject:clipVideoTrack]; 

    NSLog(@"timeRanges %@",timeRanges); 
    NSLog(@"tracks %@",tracks); 
    NSLog(@"assetClip %@",assetClip); 
    NSLog(@"clipVideoTrack %@",clipVideoTrack); 


} 

NSError *error = nil; 
BOOL sucsess = [compositionVideoTrack insertTimeRanges:timeRanges 
               ofTracks:tracks 
               atTime:kCMTimeZero 
               error:&error]; 

if (!sucsess || error) { 
    NSLog(@"video error %@", error); 


} 

장치를하려고 할 때 내가 오류는 다음과 같습니다 오류 도메인 = AVFoundationErrorDomain 코드 = -11800는 사용자 정보 = 0x1704707c0이 {NSUnderlyingError = 0x174247050 "작업이 없습니다"작업을 완료 할 수 없습니다 "비디오 오류 완료. (OSStatus 오류 -12780.)는 "NSLocalizedFailureReason는 NSLocalizedDescription이 작업은 내가 문제가, 도움이 될 수 있는지 정말 우둔입니다

NSArray *dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *docsDir = [dirPaths objectAtIndex:0]; 
    NSString *outputFilePath = [docsDir stringByAppendingPathComponent:[NSString stringWithFormat:@"Zagoori-%d.mov",arc4random() % 1000]]; 
    NSURL *outputFileUrl = [NSURL fileURLWithPath:outputFilePath]; 

    if ([[NSFileManager defaultManager] fileExistsAtPath:outputFilePath]) 
     [[NSFileManager defaultManager] removeItemAtPath:outputFilePath error:nil]; 

    //Now create an AVAssetExportSession object that will save your final video at specified path. 
    AVAssetExportSession *_assetExport = [[AVAssetExportSession alloc] initWithAsset:mixComposition 
                      presetName:AVAssetExportPresetLowQuality]; 

    NSLog(@"supportedFileTypes %@", [_assetExport supportedFileTypes]); 
    _assetExport.outputFileType = @"com.apple.quicktime-movie"; 
    _assetExport.outputURL = outputFileUrl; 
    [_assetExport exportAsynchronouslyWithCompletionHandler:^ 
    { 
     dispatch_async(dispatch_get_main_queue(), ^{ 

      switch ([_assetExport status]) { 
       case AVAssetExportSessionStatusExporting: 
        NSLog(@"Export in progress "); 
       case AVAssetExportSessionStatusFailed: 
        NSLog(@"Export failed (%ld): %@", (long)[[_assetExport error] code], [[_assetExport error] localizedFailureReason]); 
        [_assetExport cancelExport]; 
        break; 
       case AVAssetExportSessionStatusCancelled: 
        NSLog(@"Export canceled"); 
        break; 
       case AVAssetExportSessionStatusCompleted: 
        NSLog(@"Export done"); 
        [self exportDidFinish:_assetExport]; 

        // NSLog (@"finished writing %f", [dtStartDate timeIntervalSinceNow]); 
        break; 
       case AVAssetExportSessionStatusWaiting: 
        NSLog (@"AVAssetExportSessionStatusWaiting"); 
        break; 
       case AVAssetExportSessionStatusUnknown: 
        NSLog (@"AVAssetExportSessionStatusUnknown"); 
        break; 
      } 

     }); 


    }]; 

-(void)loadMoviePlayer:(NSURL*)moviePath { 
    _moviePlayerController = [[MPMoviePlayerController alloc] 
        initWithContentURL:moviePath]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
                selector:@selector(introMovieFinished:) 
                 name:MPMoviePlayerPlaybackDidFinishNotification 
                object:_moviePlayerController]; 

    _moviePlayerController.view.hidden = NO; 
    _moviePlayerController.view.frame = CGRectMake(0, 0, _videoView.frame.size.width, 
             _videoView.frame.size.height); 
    _moviePlayerController.view.backgroundColor = [UIColor clearColor]; 
    _moviePlayerController.scalingMode = MPMovieScalingModeAspectFit; 
    _moviePlayerController.fullscreen = NO; 
    [_moviePlayerController prepareToPlay]; 
    [_moviePlayerController readyForDisplay]; 
    [_moviePlayerController setControlStyle:MPMovieControlStyleDefault]; 
    _moviePlayerController.shouldAutoplay = YES; 
    [_videoView addSubview:_moviePlayerController.view]; 
    [_videoView setHidden:NO]; 
} 

을 완료 할 수 없습니다 = 알 수없는 오류가 발생 (-12780)를 = 부디! :)

답변

0

는 그래서 그것은 AVURLAsset 인스턴스

AVURLAsset * assetClip는 루프 내부에 있으므로

의해 야기되는 문제를 발견, 그것이 유효한 외부하지없고 둘 트랙하다 난 추출.

나는 내 assetClip을 배열에 보관 했으므로 문제가 해결되었습니다.

관련 문제