补偿AVLayerVideoGravityResizeAspectFill高度差

时间:2014-10-23 20:22:25

标签: ios objective-c xcode avfoundation avcapturesession

我有一个这样的嵌套视频: Live camera feed

当用户拍照时,图像沿y轴偏移 Captured Still image

我确实希望捕获整个图像并让用户上下滚动。他们目前可以这样做,但我希望图像的起始卷轴居中以匹配相机Feed预览。因此,如果他们拍照,图像会与视频Feed显示的帧匹配。

问题是,因为相机上的方面被设置为AVLayerVideoGravityResizeAspectFill它正在做一些“裁剪”。使图像适合实时预览。由于高度远大于宽度,因此图像中捕获的顶部和底部部分未显示在实时馈送中(自然地)。

然而,我不知道裁剪的顶部是多少,所以我可以偏移预览的图像以匹配它。

所以我的问题是:你知道如何计算从纵横比设置为AVLayerVideoGravityResizeAspectFill的相机顶部裁剪多少? (Objective-C和Swift答案欢迎!)

1 个答案:

答案 0 :(得分:3)

我想出的解决方案是:

  func getVerticalOffsetAdjustment()->CGFloat
    {
        var cropRect:CGRect = _videoPreviewLayer.metadataOutputRectOfInterestForRect(_videoPreviewLayer.bounds) //returns the cropped aspect ratio box so you can use its offset position
        //Because the camera is rotated by 90 degrees, you need to use .x for the actual y value when in portrait mode
        return cropRect.origin.x/cropRect.width * frame.height
    }

我很困惑,但是因为在纵向模式下相机旋转了90度,你需要使用宽度和x值。 cropRect将返回一个类似(0.125,0,0,75,1.0)的值(您的确切值将不同)。

这告诉我的是,我移动的y值(视频直播显示我)向下移动了其总高度的12.5%,并且视频输入的高度仅为总高度的75%。

所以我取12.5%并除以75%得到规范化(到我的UIWindow)值,然后将该数量应用于scrollview偏移量。

呼!!!