iOS (Swift) で、動画撮影中のデバイス回転時の処理について
はじめまして。
現在、 Swift で動画撮影アプリを制作しておりますが、デバイスを縦横に回転させた際の処理で困っています。
デバイスを傾けたときに、撮影枠は縦横対応にうまく対応できたのですが、それに伴って被写体がうまく回転してくれません。いろいろ調べていますが、アプリ開発の初心者ということもあり、いまいち修正ポイントがわかっていません。
画面回転時のメソッドの中で、 CameraEngine.swift
の startup
処理の何かを再度、設定するべきなのかなど、初心者なりに悩んでおります。
どなたか、アドバイスをいただけないでしょうか?何卒よろしくお願いいたします。
以下に、修正すべきところと思われるソースの一部を抜粋させていただきます。
【ViewController.swift】
override func viewDidLoad(){
super.viewDidLoad()
// カメラエンジンスタート
self.cameraEngine.startup()
videoLayer = AVCaptureVideoPreviewLayer.layerWithSession(self.cameraEngine.captureSession) as AVCaptureVideoPreviewLayer
// 画面セットアップ
setupScreen()
}
// 画面回転時に呼び出される
override func willAnimateRotationToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) {
// 画面セットアップ
setupScreen()
}
// 画面セットアップ
func setupScreen(){
// ビデオレイヤー設定
videoLayer.frame = self.view.bounds
videoLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
self.view.layer.addSublayer(videoLayer)
}
【CameraEngine.swift】
func startup(){
// video input
self.videoDevice.activeVideoMinFrameDuration = CMTimeMake(1, 30)
var captureDevice: AVCaptureDevice?
// バックカメラ
captureDevice = self.videoDevice
let videoInput = AVCaptureDeviceInput.deviceInputWithDevice(captureDevice, error: nil) as AVCaptureDeviceInput
self.captureSession.addInput(videoInput)
// audio input
let audioInput = AVCaptureDeviceInput.deviceInputWithDevice(self.audioDevice, error: nil) as AVCaptureDeviceInput
self.captureSession.addInput(audioInput);
// video output
var videoDataOutput = AVCaptureVideoDataOutput()
videoDataOutput.setSampleBufferDelegate(self, queue: self.recordingQueue)
videoDataOutput.alwaysDiscardsLateVideoFrames = true
videoDataOutput.videoSettings = [
kCVPixelBufferPixelFormatTypeKey : kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange
]
self.captureSession.addOutput(videoDataOutput)
self.height = videoDataOutput.videoSettings["Height"] as Int!
self.width = videoDataOutput.videoSettings["Width"] as Int!
// audio output
var audioDataOutput = AVCaptureAudioDataOutput()
audioDataOutput.setSampleBufferDelegate(self, queue: self.recordingQueue)
self.captureSession.addOutput(audioDataOutput)
self.captureSession.startRunning()
}
【追記】20150121
デバイス横のイメージ
デバイス縦のイメージ