7

我想使用UISlider缩放相机。

我通过调整AVCaptureVideoPreviewLayer的AffineTransform成功完成了它。

这是它的代码

-(void)sliderAction:(UISlider*)sender{
    CGAffineTransform affineTransform = CGAffineTransformMakeTranslation(sender.value, sender.value);
    affineTransform = CGAffineTransformScale(affineTransform, sender.value, sender.value);
    affineTransform = CGAffineTransformRotate(affineTransform, 0);
    [CATransaction begin];
    [CATransaction setAnimationDuration:.025];
     //previewLayer is object of AVCaptureVideoPreviewLayer
    [[[self captureManager]previewLayer] setAffineTransform:affineTransform];
    [CATransaction commit];
}

但是当我捕捉它时,我得到的是非缩放的图像对象。

4

2 回答 2

3

回复有点晚了。但我正在回复以供将来参考。实际上,您在代码中所做的只是更改了预览层的缩放因子,而不是底层输出连接。但是要使缩放最初反映在捕获的输出上,您还必须将因素放入输出连接中。您可以使用类似于以下的内容:

-(void)sliderAction:(UISlider*)sender
{
    AVCaptureConnection* connection = [self.photoOutput connectionWithMediaType:AVMediaTypeVideo]; // photoOutput is a AVCaptureStillImageOutput object, representing a capture session output with customized preset

    CGAffineTransform affineTransform = CGAffineTransformMakeTranslation(sender.value, sender.value);
    affineTransform = CGAffineTransformScale(affineTransform, sender.value, sender.value);
    affineTransform = CGAffineTransformRotate(affineTransform, 0);
    [CATransaction begin];
    [CATransaction setAnimationDuration:.025];
     //previewLayer is object of AVCaptureVideoPreviewLayer
    [[[self captureManager]previewLayer] setAffineTransform:affineTransform];
    if (connection) {
        connection.videoScaleAndCropFactor = sender.value;
    }
    [CATransaction commit];
}

它应该可以解决问题。

理想情况下,您不应connection.videoScaleAndCropFactor在例程中执行更改,Slider而应将代码放在原始捕获例程中,并仅在调用captureStillImageAsynchronouslyFromConnection方法之前使用滑块的瞬时值设置一次。

希望能帮助到你 :)

于 2013-11-03T12:13:06.767 回答
0

首先,您的代码仅缩放图层内容而不是CMSampleBuffer. 您的下一个工作是在CVPixelBufferfromCMSampleBuffer和 save scaled上CMSampleBuffer进行缩放AVWriter。您可以使用Accelerate.framework来扩展CVPixelBuffer

于 2013-10-23T09:11:18.857 回答