2013-04-20 10 views
12

Ich arbeite mit einer App, in der der Benutzer ein Video aus Fotos auswählt und es auf den Server hochlädt. Da mein Server der .Net-Server ist, wird das Video gedreht. Ich weiß, der Grund des Problems ist wahrscheinlich das gleiche wie im Falle des Bildes (Sie können meine frühere Antwort beziehen https://stackoverflow.com/a/10601175/1030951), also ich googelte und bekam einen Code zu beheben Video-Orientierung, ich habe einen Code von RayWenderlich.com und modifiziert in folgenden Weg. Jetzt funktioniert mein Video gut, aber das Video ist stumm. Es spielt, spielt aber kein Audio. Bitte hilf mir, wenn mir etwas fehlt.So beheben Sie das Problem mit der Videoausrichtung in iOS

passiere ich Info-Wörterbuch von -(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info Methode

- (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

Sie sind sicher, dass Ihr iPhone nicht stummgeschaltet ist? – Peres

+0

ja, ich spielte in Fotos app, es spielte mit Ton .. – HarshIT

+0

überprüfen Sie, dass Sie vielleicht halp http://StackOverflow.com/Questions/2814626/Programatically-Access-Orientation-of-iphone-Video –

Antwort

8

Fügen Sie diese nach dem //VIDEO TRACK Teil

 //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

Danke, es funktioniert wirklich ....... – HarshIT

+0

wird es auch für Video funktionieren? Ich meine, ich habe Probleme mit der Ausrichtung der zusammengeführten Videos nach der Transformation. Jede Hilfe wird geschätzt. –

+0

@AbdulYasin finden Sie Lösung der Orientierungsproblem nach dem Zusammenführen ??? Wenn ja, kannst du mir einen Vorschlag geben – Nilesh

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

Nach AVMutableCompositionTrack hinzufügen.

setPreferredTransform: set hier Ihr Ausgangsvideo, das Sie mit der gleichen Ausrichtung exportieren möchten.

// 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]; 
    } 
Verwandte Themen