• 第5月第14天 视频编辑


    1.视频方向

    + (NSUInteger)degressFromVideoFileWithURL:(NSURL *)url
    {
        NSUInteger degress = 0;
        AVAsset *asset = [AVAsset assetWithURL:url];
        NSArray *tracks = [asset tracksWithMediaType:AVMediaTypeVideo];
        if([tracks count] > 0) {
            AVAssetTrack *videoTrack = [tracks objectAtIndex:0];
            CGAffineTransform t = videoTrack.preferredTransform;
            if(t.a == 0 && t.b == 1.0 && t.c == -1.0 && t.d == 0){
                // Portrait
                degress = 90;
            }else if(t.a == 0 && t.b == -1.0 && t.c == 1.0 && t.d == 0){
                // PortraitUpsideDown
                degress = 270;
            }else if(t.a == 1.0 && t.b == 0 && t.c == 0 && t.d == 1.0){
                // LandscapeRight
                degress = 0;
            }else if(t.a == -1.0 && t.b == 0 && t.c == 0 && t.d == -1.0){
                // LandscapeLeft
                degress = 180;
            }
        }
        return degress;
    }

     http://www.tuicool.com/articles/IjyUnmb

    2.

      // 3.1 - Create AVMutableVideoCompositionInstruction
      AVMutableVideoCompositionInstruction *mainInstruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction];
      mainInstruction.timeRange = CMTimeRangeMake(kCMTimeZero, self.videoAsset.duration);
    
      // 3.2 - Create an AVMutableVideoCompositionLayerInstruction for the video track and fix the orientation.
      AVMutableVideoCompositionLayerInstruction *videolayerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:videoTrack];
      AVAssetTrack *videoAssetTrack = [[self.videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
      UIImageOrientation videoAssetOrientation_  = UIImageOrientationUp;
      BOOL isVideoAssetPortrait_  = NO;
      CGAffineTransform videoTransform = videoAssetTrack.preferredTransform;
      if (videoTransform.a == 0 && videoTransform.b == 1.0 && videoTransform.c == -1.0 && videoTransform.d == 0) {
        videoAssetOrientation_ = UIImageOrientationRight;
        isVideoAssetPortrait_ = YES;
      }
      if (videoTransform.a == 0 && videoTransform.b == -1.0 && videoTransform.c == 1.0 && videoTransform.d == 0) {
        videoAssetOrientation_ =  UIImageOrientationLeft;
        isVideoAssetPortrait_ = YES;
      }
      if (videoTransform.a == 1.0 && videoTransform.b == 0 && videoTransform.c == 0 && videoTransform.d == 1.0) {
        videoAssetOrientation_ =  UIImageOrientationUp;
      }
      if (videoTransform.a == -1.0 && videoTransform.b == 0 && videoTransform.c == 0 && videoTransform.d == -1.0) {
        videoAssetOrientation_ = UIImageOrientationDown;
      }
      [videolayerInstruction setTransform:videoAssetTrack.preferredTransform atTime:kCMTimeZero];
      [videolayerInstruction setOpacity:0.0 atTime:self.videoAsset.duration];
    
      // 3.3 - Add instructions
      mainInstruction.layerInstructions = [NSArray arrayWithObjects:videolayerInstruction,nil];
    
      AVMutableVideoComposition *mainCompositionInst = [AVMutableVideoComposition videoComposition];
    
      CGSize naturalSize;
      if(isVideoAssetPortrait_){
        naturalSize = CGSizeMake(videoAssetTrack.naturalSize.height, videoAssetTrack.naturalSize.width);
      } else {
        naturalSize = videoAssetTrack.naturalSize;
      }
    
      float renderWidth, renderHeight;
      renderWidth = naturalSize.width;
      renderHeight = naturalSize.height;
      mainCompositionInst.renderSize = CGSizeMake(renderWidth, renderHeight);
      mainCompositionInst.instructions = [NSArray arrayWithObject:mainInstruction];
      mainCompositionInst.frameDuration = CMTimeMake(1, 30);
    
      [self applyVideoEffectsToComposition:mainCompositionInst size:naturalSize];
    - (void)applyVideoEffectsToComposition:(AVMutableVideoComposition *)composition size:(CGSize)size
    {
      // 1 - set up the overlay
      CALayer *overlayLayer = [CALayer layer];
      UIImage *overlayImage = nil;
      if (_frameSelectSegment.selectedSegmentIndex == 0) {
        overlayImage = [UIImage imageNamed:@"Frame-1.png"];
      } else if(_frameSelectSegment.selectedSegmentIndex == 1) {
        overlayImage = [UIImage imageNamed:@"Frame-2.png"];
      } else if(_frameSelectSegment.selectedSegmentIndex == 2) {
        overlayImage = [UIImage imageNamed:@"Frame-3.png"];
      }
     
      [overlayLayer setContents:(id)[overlayImage CGImage]];
      overlayLayer.frame = CGRectMake(0, 0, size.width, size.height);
      [overlayLayer setMasksToBounds:YES];
     
      // 2 - set up the parent layer
      CALayer *parentLayer = [CALayer layer];
      CALayer *videoLayer = [CALayer layer];
      parentLayer.frame = CGRectMake(0, 0, size.width, size.height);
      videoLayer.frame = CGRectMake(0, 0, size.width, size.height);
      [parentLayer addSublayer:videoLayer];
      [parentLayer addSublayer:overlayLayer];
     
      // 3 - apply magic
      composition.animationTool = [AVVideoCompositionCoreAnimationTool
                                   videoCompositionCoreAnimationToolWithPostProcessingAsVideoLayer:videoLayer inLayer:parentLayer];
    
    }

    http://www.cocoachina.com/ios/20141208/10542.html

  • 相关阅读:
    鲍尔默称微软将投入数十亿美元打造数据中心业务(转)
    程序流程的辅助控制
    获取程序所在目录
    越界赋值
    长字串与宽字串
    长字串与短字串
    指针的运算
    Windows API 的数据类型与 Delphi 数据类型对照表
    给动态数组添加一个元素
    Delphi 与 C/C++ 数据类型对照表
  • 原文地址:https://www.cnblogs.com/javastart/p/6396289.html
Copyright © 2020-2023  润新知