【问题标题】:Compensate For AVLayerVideoGravityResizeAspectFill Height Difference补偿 AVLayerVideoGravityResizeAspectFill 高度差
【发布时间】:2014-10-25 02:14:49
【问题描述】:

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

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

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

问题是,因为相机上的宽高比设置为 AVLayerVideoGravityResizeAspectFill,它会进行一些“裁剪”以使图像适合实时预览。由于高度远大于宽度,因此图像中捕获的顶部和底部部分不会显示在实时提要中(自然)。

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

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

【问题讨论】:

    标签: ios objective-c xcode avfoundation avcapturesession


    【解决方案1】:

    我想出的解决方案是这样的:

      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)值,然后将该数量应用于滚动视图偏移量。

    哇!!!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-04
      • 2015-10-17
      • 2015-08-10
      相关资源
      最近更新 更多