【问题标题】:Flip the video recorded with front facing camera along horizontal axis in IOS在IOS中沿水平轴翻转前置摄像头录制的视频
【发布时间】:2014-11-24 07:21:42
【问题描述】:

我正在尝试取消镜像 iPhone 前置摄像头在录制视频时产生的镜像效果。基本上,我想将前置摄像头拍摄的视频沿水平轴翻转,这样最终编辑的视频就不会像内置相机应用程序那样具有镜像效果。我正在使用 AVCaptureSession 录制视频。

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

//*********下面是我正在应用的变换,您可能对它们感兴趣************

CGAffineTransform t = CGAffineTransformMakeTranslation(videoAssetTrack.naturalSize.height, 0.0);
t = CGAffineTransformMakeRotation(degreesToRadians(90.0));
t = CGAffineTransformMakeScale(-1, 1);  //this line is where I am having problem

[videolayerInstruction setTransform:t atTime:kCMTimeZero];
[videolayerInstruction setOpacity:1.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);

在上面的代码中,当我移除缩放变换时 t = CGAffineTransformMakeScale(-1, 1);

我得到了方向正确的视频帧,但它们没有翻转。当我应用缩放变换时,我得到空白视频帧。目前,我只为纵向模式视频执行此操作。

如果有人对此有任何了解,请分享。 提前谢谢你。

【问题讨论】:

    标签: ios video-capture cgaffinetransform avmutablecomposition front-camera


    【解决方案1】:

    您在仿射变换方面犯了一个小错误。

    替换代码:

    CGAffineTransform t = CGAffineTransformMakeTranslation(videoAssetTrack.naturalSize.height, 0.0);
    t = CGAffineTransformMakeRotation(degreesToRadians(90.0));
    t = CGAffineTransformMakeScale(-1, 1);  //this line is where I am having problem
    

    使用更正的代码:

    CGAffineTransform t = CGAffineTransformMakeScale(-1.0f, 1.0f);
    t = CGAffineTransformTranslate(t, -videoAssetTrack.naturalSize.width, 0);
    t = CGAffineTransformRotate(t, (degreesToRadians(90.0)));
    t = CGAffineTransformTranslate(t, 0.0f, -videoAssetTrack.naturalSize.width);
    

    【讨论】:

    • 此解决方案有效,但如果我横向录制,视频无法正确旋转...
    【解决方案2】:

    Swift 3 版本

            let instruction = AVMutableVideoCompositionInstruction()
        instruction.timeRange = CMTimeRangeMake(kCMTimeZero, CMTimeMakeWithSeconds(60, 30))
        var transform:CGAffineTransform = CGAffineTransform(scaleX: -1.0, y: 1.0)
        transform = transform.translatedBy(x: -clipVideoTrack.naturalSize.width, y: 0.0)
        transform = transform.rotated(by: CGFloat(Double.pi/2))
        transform = transform.translatedBy(x: 0.0, y: -clipVideoTrack.naturalSize.width)
    

    【讨论】:

    • 按预期工作
    【解决方案3】:
    var size = videotrackatfirst.naturalSize
    var transform = videotrackatfirst.preferredTransform
    
    if (size.width == transform.tx && size.height == transform.ty) {          
                    println("UIInterfaceOrientationLandscapeRight")
                    var invert = CGAffineTransformInvert(videotrackatfirst.preferredTransform)
                    layerInstruction.setTransform(invert, atTime: insertTime)
        }
    

    【讨论】:

      【解决方案4】:

      在 Swift (2.0) 中

          var transform:CGAffineTransform = CGAffineTransformMakeScale(-1.0, 1.0)
          transform = CGAffineTransformTranslate(transform, -videoInput.naturalSize.width, 0.0)
          transform = CGAffineTransformRotate(transform, CGFloat(M_PI_2))
          transform = CGAffineTransformTranslate(transform, 0.0, -videoInput.naturalSize.width)
          videoInput.transform = transform
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-01
        • 2016-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多