2013-04-20 14 views
12

Kullanıcının Video'dan video seçip sunucuya yüklediği bir uygulama ile çalışıyorum. Sunucum .Net sunucusu olduğu için, video döndürülüyor. Sorunun sebebinin muhtemelen göründüğüyle aynı olduğunu biliyorum (daha önceki cevabımı https://stackoverflow.com/a/10601175/1030951 numaralı telefona yönlendirebilirsiniz), Yani googled ve video oryantasyonunu düzeltmek için bir kod aldım, RayWenderlich.com'dan bir kod aldım ve takip eden yol. Şimdi çıkış videom iyi çalışıyor ancak video sessiz. çalar ancak ses çalmaz. Bir şey eksik olursam lütfen bana yardım edin.iOS'ta video yönlendirmesi sorunu nasıl giderilir

Ben

- (void)fix:(NSDictionary*)pobjInfoDirectory withFileName:(NSString*)pstrOutputFileName 
{ 
    firstAsset = [AVAsset assetWithURL:[pobjInfoDirectory objectForKey:UIImagePickerControllerMediaURL]]; 


    if(firstAsset !=nil) 
    { 
     //Create AVMutableComposition Object.This object will hold our multiple AVMutableCompositionTrack. 
     AVMutableComposition* mixComposition = [[AVMutableComposition alloc] init]; 

     //VIDEO TRACK 
     AVMutableCompositionTrack *firstTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid]; 
     [firstTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, firstAsset.duration) ofTrack:[[firstAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:kCMTimeZero error:nil]; 

     AVMutableVideoCompositionInstruction * MainInstruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction]; 

       MainInstruction.timeRange = CMTimeRangeMake(kCMTimeZero, firstAsset.duration); 

     //FIXING ORIENTATION// 
     AVMutableVideoCompositionLayerInstruction *FirstlayerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:firstTrack]; 

     AVAssetTrack *FirstAssetTrack = [[firstAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]; 

     UIImageOrientation FirstAssetOrientation_ = UIImageOrientationUp; 

     BOOL isFirstAssetPortrait_ = NO; 

     CGAffineTransform firstTransform = FirstAssetTrack.preferredTransform; 

     if(firstTransform.a == 0 && firstTransform.b == 1.0 && firstTransform.c == -1.0 && firstTransform.d == 0) 
     { 
      FirstAssetOrientation_= UIImageOrientationRight; isFirstAssetPortrait_ = YES; 
     }   
     if(firstTransform.a == 0 && firstTransform.b == -1.0 && firstTransform.c == 1.0 && firstTransform.d == 0) 
     { 
      FirstAssetOrientation_ = UIImageOrientationLeft; isFirstAssetPortrait_ = YES; 
     } 
     if(firstTransform.a == 1.0 && firstTransform.b == 0 && firstTransform.c == 0 && firstTransform.d == 1.0) 
     { 
      FirstAssetOrientation_ = UIImageOrientationUp; 
     } 
     if(firstTransform.a == -1.0 && firstTransform.b == 0 && firstTransform.c == 0 && firstTransform.d == -1.0) 
     { 
      FirstAssetOrientation_ = UIImageOrientationDown; 
     } 

     CGFloat FirstAssetScaleToFitRatio = 320.0/FirstAssetTrack.naturalSize.width; 

     if(isFirstAssetPortrait_) 
     { 
      FirstAssetScaleToFitRatio = 320.0/FirstAssetTrack.naturalSize.height; 
      CGAffineTransform FirstAssetScaleFactor = CGAffineTransformMakeScale(FirstAssetScaleToFitRatio,FirstAssetScaleToFitRatio); 
      [FirstlayerInstruction setTransform:CGAffineTransformConcat(FirstAssetTrack.preferredTransform, FirstAssetScaleFactor) atTime:kCMTimeZero]; 
     } 
     else 
     { 
      CGAffineTransform FirstAssetScaleFactor = CGAffineTransformMakeScale(FirstAssetScaleToFitRatio,FirstAssetScaleToFitRatio); 
      [FirstlayerInstruction setTransform:CGAffineTransformConcat(CGAffineTransformConcat(FirstAssetTrack.preferredTransform, FirstAssetScaleFactor),CGAffineTransformMakeTranslation(0, 160)) atTime:kCMTimeZero]; 
     } 
     [FirstlayerInstruction setOpacity:0.0 atTime:firstAsset.duration]; 

     MainInstruction.layerInstructions = [NSArray arrayWithObjects:FirstlayerInstruction,nil];; 

     AVMutableVideoComposition *MainCompositionInst = [AVMutableVideoComposition videoComposition]; 
     MainCompositionInst.instructions = [NSArray arrayWithObject:MainInstruction]; 
     MainCompositionInst.frameDuration = CMTimeMake(1, 30); 
     MainCompositionInst.renderSize = CGSizeMake(320.0, 480.0); 

     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
     NSString *documentsDirectory = [paths objectAtIndex:0]; 
     NSString *myPathDocs = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"mergeVideo-%d.mov",arc4random() % 1000]]; 

     NSURL *url = [NSURL fileURLWithPath:myPathDocs]; 

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

     exporter.outputURL=url; 
     exporter.outputFileType = AVFileTypeQuickTimeMovie; 
     exporter.videoComposition = MainCompositionInst; 
     exporter.shouldOptimizeForNetworkUse = YES; 
     [exporter exportAsynchronouslyWithCompletionHandler:^ 
     { 
      dispatch_async(dispatch_get_main_queue(), ^{ 
       [self exportDidFinish:exporter]; 
      }); 
     }]; 
    } 
} 

- (void)exportDidFinish:(AVAssetExportSession*)session 
{ 
    if(session.status == AVAssetExportSessionStatusCompleted) 
    { 
     NSURL *outputURL = session.outputURL; 
     ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; 

     if ([library videoAtPathIsCompatibleWithSavedPhotosAlbum:outputURL]) 
     { 
      if ([self.delegate respondsToSelector:@selector(videoExported)]) 
       [self.delegate videoExported];  
     } 
    }  
    firstAsset = nil; 
} 
+1

Sessiz olan iPhone'unuzun olmadığından emin misiniz? – Peres

+0

evet, fotoğraf uygulamasında oynadım, bu sesle çalındı ​​.. – HarshIT

+0

bunu kontrol edebilirsiniz http://stackoverflow.com/questions/2814626/programatically-access-orientation-of-anhone-video –

cevap

8

 //AUDIO TRACK 
     AVMutableCompositionTrack *firstAudioTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; 
     [firstAudioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, firstAsset.duration) ofTrack:[[firstAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] atTime:kCMTimeZero error:nil]; 
+0

Teşekkürler, gerçekten çalışıyor ....... – HarshIT

+0

video için de işe yarayacak mı? Dönüşüm uyguladıktan sonra birleştirilmiş videoların yönelimi ile ilgili sorunla karşı karşıya olduğum anlamına gelir. Herhangi bir yardım takdir edilir. –

+0

@AbdulYasin birleştirdikten sonra Oryantasyon sorununun çözümünü buldunuz ??? eğer evet bana öneri verebilir misin – Nilesh

1
AVURLAsset* videoAsset = [[AVURLAsset alloc]initWithURL:@"your video url here..." options:nil]; 

AVMutableCompositionTrack sonra Ekle //VIDEO TRACK parçası sonra bu ekle -(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info yöntemin Bilgi sözlüğünü geçmektedir.

setPreferredTransform: set, aynı yönlendirmeyle vermek istediğiniz kaynak videonuzu burada ayarlayın.

// Grab the source track from AVURLAsset for example. 
AVAssetTrack *assetVideoTrack = [videoAsset tracksWithMediaType:AVMediaTypeVideo].lastObject; 

// Grab the composition video track from AVMutableComposition you already made. 
AVMutableCompositionTrack *compositionVideoTrack = [mixComposition tracksWithMediaType:AVMediaTypeVideo].lastObject; 

// Apply the original transform. 
if (assetVideoTrack && compositionVideoTrack) { 
     [compositionVideoTrack setPreferredTransform:assetVideoTrack.preferredTransform]; 
    } 
İlgili konular