AVFoundation相机缩放

7

我使用AVFoundation框架来从相机显示视频。

我通常使用以下代码:

session = [[AVCaptureSession alloc] init] ;
...   
captureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];
...
[cameraView.layer addSublayer:captureVideoPreviewLayer];
...

我想为相机添加缩放功能。

我找到了两种实现缩放的方法。

第一种:使用CGAffineTransform

cameraView.transform = CGAffineTransformMakeScale(x,y);

第二种:将相机视图放入滚动视图中,设置最大和最小滚动范围,并将该视图设置为缩放视图。

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
    return cameraView;
}

如何提高缩放的性能和质量?还有其他方法可以实现缩放吗?也许我错过了一些用于缩放的AVFoundation方法。

谢谢。


我本来希望能得到一个真正专家的评论,但由于没有人参与讨论,所以我想分享一下我的经验。由于没有真正的机械变焦,它实际上只是在玩弄纵横比。我发现在处理图层时,使用CGAffineTransform非常有效,特别是如果您在创建会话时设置了AVCaptureVideoPreviewLayer.videoGravity设置。将变换与滑块或捏合手势链接起来非常简单。 如果将其框架设置为视图边界,则变换甚至可以处理奇怪的帧大小。希望这有所帮助。 - CocoaEv
谢谢您的回答,我想使用变换实现缩放,但是我用scrollview缩放只花了很少的时间,效果非常好:) 我曾经想过问一下问题,也许AV框架有一些关于缩放的东西。 - B.S.
滚动视图的好提示。我也要去查一下。 - CocoaEv
这个能让你缩小到多远?你能缩小到超过默认级别吗? - zakdances
你好!iPhone 5或更新设备上的iOS7支持在AVCaptureDevice上设置setVideoZoomScale:。请参见:http://stackoverflow.com/questions/22799110/apply-cgaffinetransform-prior-to-layer-being-displayed/22834443#22834443 - Balazs Nemeth
1个回答

6
实际上,有一个名为setVideoScaleandCropFactorGCFloat
你可以在这里找到文档:这里
我不确定这是否仅适用于静态图像输出,但我一直在研究它,并且如果你将其设置为手势或滑块并让其控制float,则效果很好。
你可以在这里找到它的演示。
很棒。 我正在尝试循环它,以便可以创建带缩放的条形码扫描器。 但我做得很粗糙哈哈。

2
videoScaleAndCropFactor对视频无效。videoMaxScaleAndCropFactor设置为1.0,如果更改videoScaleAndCropFactor,则会抛出异常。 - just.jimmy
@Nathan Kellert,我没有理解AVCaptureSession属性VideoScaleandCropFactor,你能否请解释一下如何实现视频缩放(而不是缩放视频视图)…? - Mitul Bhadeshiya
视频缩放和裁剪因子是实际视频本身的缩放。与开发人员以前使用的方法不同。这种方法是1)捕获视频2)缩放它3)基于新比例重新捕获视频(导致像素化)。新的iOS 7功能实际上首先对视频进行缩放,然后以完整分辨率捕获它。您基本上想设置一个视图缩放,以便观看者可以在屏幕上看到视频实际捕获的内容。否则,视频可能会捕获缩放的视频,但屏幕看起来完全正常。实际上,演示应用程序确实有很多帮助来展示它的工作原理。 - Nathan Kellert
1
你好!iPhone 5或更新设备上的iOS7支持在AVCaptureDevice上设置setVideoZoomScale:。请参见:http://stackoverflow.com/questions/22799110/apply-cgaffinetransform-prior-to-layer-being-displayed/22834443#22834443 - Balazs Nemeth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接