動画を撮影するようなコードを書くときに、手ぶれ補正をつけたくて調べていると
「ほう、AVCaptureConnection.preferredVideoStabilizationMode
を設定すればええんやな」
ということで雑に
output.connection(with: .video)?.preferredVideoStabilizationMode = .auto
と設定してみたところ体感効いていなかったので
device.activeFormat.isVideoStabilizationModeSupported(_):
で確認してみると、.off
が返ってきた。
あれれーおかしいぞーと思いながらあれこれ調べていると
Currently, only the 1080p30 and 1080p60 video formats support cinematic stabilization. The default value for preferredVideoStabilizationMode is AVCaptureVideoStabilizationModeOff. As on earlier products, only the 16:9 video formats support stabilization.
なるほど、AVCaptureDevice.Formatの解像度とfpsによって使えたり使えなかったりするのか
ということで
let format = device.formats.filter { $0.isAnyStabilizationModeSupported }
.max(by: { $0.formatDescription.dimensions.width < $1.formatDescription.dimensions.width })
で手ぶれ補正対応のformatで最も解像度が高いものを取り出してdevice.activeFormat
に突っ込むと手ぶれ補正効きました。
ちなみにiPhone14 Proで選択された解像度は3840x2160
、全然1080pじゃなかった。上のリンクの情報古いのかな。
ところで上のコードのisAnyStabilizationSupported
はextensionで定義しているもので、中身は
private extension AVCaptureDevice.Format {
var isAnyStabilizationModeSupported: Bool {
return isVideoStabilizationModeSupported(.cinematicExtended)
|| isVideoStabilizationModeSupported(.cinematic)
|| isVideoStabilizationModeSupported(.standard)
}
}
となっています。isVideoStabilizationModeSupported(.auto)
でええやんwと思ったのですが、これだと.off
も含まれてしまうので全てのフォーマットがtrueを返してしまうようです。
それにしても.cinematicExtended
すごいぞ。ほぼgo proやん