2013-04-20 18 views
12

我正在使用一個應用程序,用戶從照片中選取視頻並將其上傳到服務器。由於我的服務器是.Net服務器,因此視頻會旋轉。我知道問題的原因可能與圖像的情況相同(你可以參考我以前的回答https://stackoverflow.com/a/10601175/1030951),所以我谷歌搜索並得到了一個代碼來修復視頻方向,我從RayWenderlich.com得到了一個代碼,並在以下方式。現在我的輸出視頻工作正常,但視頻靜音。它播放但不播放音頻。如果我錯過了一些東西,請幫助我。如何修復iOS中的視頻方向問題

我通過-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info方法的信息字典

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

你確定這不是你的iPhone是靜音? – Peres 2013-04-20 09:10:16

+0

是的,我在照片應用播放的,它打了聲.. – HarshIT 2013-04-20 09:16:50

+0

檢查這可能HALP你http://stackoverflow.com/questions/2814626/programatically-access-orientation-of-an-iphone-video – 2013-04-20 09:59:38

回答

8

//VIDEO TRACK部分

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

謝謝,它確實有效....... – HarshIT 2013-04-22 04:57:09

+0

它也可以用於視頻嗎?我的意思是我應用轉換後面臨合併視頻的方向問題。任何幫助表示讚賞。 – 2015-01-09 05:15:09

+0

@AbdulYasin合併後你發現方向問題的解決方案?如果是的話,你可以給我建議 – Nilesh 2015-11-19 13:53:02

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

添加AVMutableCompositionTrack後後添加此。

設置setPreferredTransform:這裏設置你的源視頻要與同一方向出口。

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