2013-01-09 18 views
8

का उपयोग कर वीडियो और ऑडियो लिखना मुझे एक अजीब समस्या है। मेरे ऐप में मैं नीचे दिए गए कोड का उपयोग कर कई ऑडियो और वीडियो फाइलों को जोड़ रहा हूं। परिणामस्वरूप वीडियो डिवाइस से कंप्यूटर पर डाउनलोड करने और क्विक टाइम के साथ खेलने के बाद ठीक काम करता प्रतीत होता है, लेकिन जब भी मैं UIWebView या AVPLayer का उपयोग करके नए बनाये गये वीडियो को चलाने की कोशिश कर रहा हूं, तो मैं केवल विलय की गई वीडियो फ़ाइलों का पहला भाग देख सकता हूं।AVMutableComposition

इसके अलावा जब मैंने MPMoviePlayerController को "लोडिंग" पर लटकने के लिए उपयोग करने का प्रयास किया।

मैं सभी रचनाओं के लिए ऑडियो सुन सकता हूं। इसे स्पष्ट करने के लिए मेरे पास दो एरे हैं: 1- ऑडियो फाइलों के पथ के साथ ऑडियोपीस [गीत 1, गीत 2, गीत 3]; 2- फिल्म फ़ाइलों के पथ के साथ मूवीपीस [मूवी 1, मूवी 2, मूवी 3]; उन फ़ाइलों को विलय करने के बाद मैं केवल फिल्म 1 देख सकता हूं लेकिन मैं गीत 1 + गीत 2 + गीत 3 सुन सकता हूं। पीएस गाने और फिल्मों की अलग-अलग लंबाई होती है (0.2 से कम अंतर)। किसी भी मदद की सराहना की जाएगी। अग्रिम धन्यवाद, Janusz

-(void)putFilesTogether{ 
AVMutableComposition *mixComposition = [AVMutableComposition composition]; 
AVMutableCompositionTrack *videoCompositionTrack =[[AVMutableCompositionTrack alloc]init]; 
AVMutableCompositionTrack *audioCompositionTrack =[[AVMutableCompositionTrack alloc]init]; 

NSLog(@" movie %@ audio %@ ", moviePieces, audioPieces); 


NSError * error; 
for(int i=0;i<moviePieces.count;i++) 
{ 
    NSFileManager * fm = [NSFileManager defaultManager]; 
    NSString * movieFilePath; 
    NSString * audioFilePath; 
    movieFilePath = [moviePieces objectAtIndex:i]; 
    audioFilePath = [audioPieces objectAtIndex:i]; 


    if(![fm fileExistsAtPath:movieFilePath]){ 
     NSLog(@"Movie doesn't exist %@ ",movieFilePath); 
    } 
    else{ 
     NSLog(@"Movie exist %@ ",movieFilePath); 
    } 

    if(![fm fileExistsAtPath:audioFilePath]){ 
     NSLog(@"Audio doesn't exist %@ ",audioFilePath); 
    } 
    else{ 
     NSLog(@"Audio exists %@ ",audioFilePath); 
    } 


    NSURL *videoUrl = [NSURL fileURLWithPath:movieFilePath]; 
    NSURL *audioUrl = [NSURL fileURLWithPath:audioFilePath]; 


    AVURLAsset *videoasset = [[AVURLAsset alloc]initWithURL:videoUrl options:nil]; 
    AVAssetTrack *videoAssetTrack= [[videoasset tracksWithMediaType:AVMediaTypeVideo] lastObject]; 

    AVURLAsset *audioasset = [[AVURLAsset alloc]initWithURL:audioUrl options:nil]; 
    AVAssetTrack *audioAssetTrack= [[audioasset tracksWithMediaType:AVMediaTypeAudio] lastObject]; 

    videoCompositionTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid]; 

    audioCompositionTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; 

    CMTime tempTime = mixComposition.duration; 

    [audioCompositionTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, audioasset.duration) ofTrack:audioAssetTrack atTime:tempTime error:&error]; 

    [videoCompositionTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoasset.duration) ofTrack:videoAssetTrack atTime:tempTime error:&error]; 

    if(error) 
    { 
     NSLog(@"Ups. Something went wrong! %@", [error debugDescription]); 
    } 
} 


NSDate *now = [NSDate dateWithTimeIntervalSinceNow:0]; 
NSString *caldate = [now description]; 

float ran = arc4random()%1000; 
NSString * pathToSave = [NSString stringWithFormat:@"Output%@%f.mp4",caldate,ran]; 
pathToSave =[DOCUMENTS_FOLDER stringByAppendingPathComponent:pathToSave]; 
NSURL *movieUrl = [NSURL fileURLWithPath:pathToSave]; 

AVAssetExportSession *exporter =[[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPresetPassthrough]; 

exporter.outputFileType=AVFileTypeQuickTimeMovie; 
exporter.outputURL=movieUrl; 
exporter.shouldOptimizeForNetworkUse=YES; 

CMTimeValue val = mixComposition.duration.value; 

CMTime start=CMTimeMake(0, 600); 
CMTime duration=CMTimeMake(val, 600); 
CMTimeRange range=CMTimeRangeMake(start, duration); 
exporter.timeRange=range; 

[exporter exportAsynchronouslyWithCompletionHandler:^{ 
    switch ([exporter status]) { 
     case AVAssetExportSessionStatusFailed:{ 
      NSLog(@"Export failed: %@ %@", [[exporter error] localizedDescription],[[exporter error]debugDescription]); 
      NSString * message = @"Movie wasn't created. Try again later."; 
      [self performSelectorOnMainThread:@selector(dismissMe:) withObject:message waitUntilDone:NO]; 
      break;} 
     case AVAssetExportSessionStatusCancelled:{ NSLog(@"Export canceled"); 
      NSString * message1 = @"Movie wasn't created. Try again later."; 
      [self performSelectorOnMainThread:@selector(dismissMe:) withObject:message1 waitUntilDone:NO]; 
      break;} 
     case AVAssetExportSessionStatusCompleted: 
     { 
      NSString * message = @"Movie was successfully created."; 
      CMTime duration = mixComposition.duration; 

      [self saveData:duration ofPath:pathToSave]; 
      [self cleanFiles]; 
      [self performSelectorOnMainThread:@selector(dismissMe:) withObject:message waitUntilDone:NO]; 
     } 
    }}]; 

}

+0

मैं केवल एक ऑडियो/वीडियो फ़ाइल विलय कर रहा हूं। समस्या यह है कि, मेरी वीडियो फ़ाइल 40 सेकंड और ऑडियो फ़ाइल 28 सेकंड का है। तो 12 (40-28) सेकंड शेष के लिए - मैं इसे ऑडियो फ़ाइल में 0 सेकंड से दोहराना चाहता हूं। मैं यह कैसे करूँ? क्या ऐसा करने का कोई सीधा तरीका है? – Hemang

उत्तर

12

समस्या देता है में:

videoCompositionTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid]; 

audioCompositionTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; 

वे पाश शरीर के लिए बाहर ले जाया जा करने की जरूरत है।