iOS AVFoundation: Setting Orientation of Video

后端 未结 5 1312
感情败类
感情败类 2020-12-01 10:13

I\'ve been struggling with several dimensions to the problem of controlling video orientation during and after capture on an iOS device. Thanks to previous answers and docum

5条回答
  •  猫巷女王i
    2020-12-01 10:48

    Use these below method to set correct orientation according to video asset orientation in AVMutableVideoComposition

    -(AVMutableVideoComposition *) getVideoComposition:(AVAsset *)asset
    {
      AVAssetTrack *videoTrack = [[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
      AVMutableComposition *composition = [AVMutableComposition composition];
      AVMutableVideoComposition *videoComposition = [AVMutableVideoComposition videoComposition];
      CGSize videoSize = videoTrack.naturalSize;
      BOOL isPortrait_ = [self isVideoPortrait:asset];
      if(isPortrait_) {
          NSLog(@"video is portrait ");
          videoSize = CGSizeMake(videoSize.height, videoSize.width);
      }
      composition.naturalSize     = videoSize;
      videoComposition.renderSize = videoSize;
      // videoComposition.renderSize = videoTrack.naturalSize; //
      videoComposition.frameDuration = CMTimeMakeWithSeconds( 1 / videoTrack.nominalFrameRate, 600);
    
      AVMutableCompositionTrack *compositionVideoTrack;
      compositionVideoTrack = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
      [compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, asset.duration) ofTrack:videoTrack atTime:kCMTimeZero error:nil];
      AVMutableVideoCompositionLayerInstruction *layerInst;
      layerInst = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:videoTrack];
      [layerInst setTransform:videoTrack.preferredTransform atTime:kCMTimeZero];
      AVMutableVideoCompositionInstruction *inst = [AVMutableVideoCompositionInstruction videoCompositionInstruction];
      inst.timeRange = CMTimeRangeMake(kCMTimeZero, asset.duration);
      inst.layerInstructions = [NSArray arrayWithObject:layerInst];
      videoComposition.instructions = [NSArray arrayWithObject:inst];
      return videoComposition;
    }
    
    
    -(BOOL) isVideoPortrait:(AVAsset *)asset
    {
      BOOL isPortrait = FALSE;
      NSArray *tracks = [asset tracksWithMediaType:AVMediaTypeVideo];
      if([tracks    count] > 0) {
        AVAssetTrack *videoTrack = [tracks objectAtIndex:0];
    
        CGAffineTransform t = videoTrack.preferredTransform;
        // Portrait
        if(t.a == 0 && t.b == 1.0 && t.c == -1.0 && t.d == 0)
        {
            isPortrait = YES;
        }
        // PortraitUpsideDown
        if(t.a == 0 && t.b == -1.0 && t.c == 1.0 && t.d == 0)  {
    
            isPortrait = YES;
        }
        // LandscapeRight
        if(t.a == 1.0 && t.b == 0 && t.c == 0 && t.d == 1.0)
        {
            isPortrait = FALSE;
        }
        // LandscapeLeft
        if(t.a == -1.0 && t.b == 0 && t.c == 0 && t.d == -1.0)
        {
            isPortrait = FALSE;
        }
       }
      return isPortrait;
    }
    

提交回复
热议问题