AVCaptureVideoPreviewLayerで画面調整

1日のブログ閲覧人数を確認すると200人を超していたので、何か書きます。

題名にあるAVCaptureVideoPreviewLayerとはiOSでのSwiftプログラミング言語によるカメラやビデオを表示する機能です。

前面と背面を同時録画機能を持っています。

またiPhoneX系で動作します。カメラ機能はiPhonePro用に設定しています。よろしければスターButtonを押していただけると幸いです。

https://github.com/daisukenagata/BothSidesCamera

自身で開発した世界初のオープンソースライブラリーです。

動画再生画面と撮影画面の表示域が一致しない現象と枠線がギザギザになる現象の解決策をご紹介します。

動画再生画面と撮影画面の表示域が一致させる方法は、

layer.videoGravity = .resizeAspectFill

で、全画面設定後に手動プログラムでサイズ変更すると一致します。

import UIKit

import AVFoundation

public class BothSidesPreviewView: UIView {

    public var videoPreviewLayer: AVCaptureVideoPreviewLayer {

        guard let layer = layer as? AVCaptureVideoPreviewLayer else {

            fatalError("Expected `AVCaptureVideoPreviewLayer` type for layer. Check PreviewView.layerClass implementation.")

        }

        layer.videoGravity = .resizeAspectFill

        return layer

    }

    public override class var layerClass: AnyClass {

        return AVCaptureVideoPreviewLayer.self

    }

}

16:9で画面調整

これで動画再生画面と撮影画面の表示域が一致しました。

インナーのプレビュー画面の淵がギザギザに

一つは滑らか、一つはギザギザの方です。

このように回転差分を丸め込ませるつもりで、回転の微調整をして修正
// Smooth implementation
self.transform = CGAffineTransform(rotationAngle: CGFloat.pi/180 * -0.01)

上記の誤差をデバッグでこの数値がここまで違うという表現も考えましたが、

まずはなぜこのアプローチに至ったかというと、FloatやSIMD2の値はランダムで小数点の値が変化していくことを知っていました。

ということはXcodeが計算しながら、数値が動いてギザギザになっているのではないかと推測しました。そして上記の関数で数値を一定に保つことで、解決できました。

プログラミングは無意識で修正できるようになるのも重要です。勿論必要な時は数値で可視化なども出来る必要があると思います。解決のアプローチが出来れば、数値可視化などは無思考な部分なのですけど。

思考を無意識レベルまで、挿入することをお勧めします。挿入方法は薄く、濃く、毎日の反復です。

以上、貴重なお時間お読みくださいまして、誠にありがとうございます。