Xamarin.iOS + AVFoundation でフロントカメラからキャプチャする
ここまでMac, UWPとやってきたのでiOSでもやってみます。 リポジトリはこちら。
Mac のコードコピペでよい
いろいろ書こうと思ったのですがほぼコピペで動きます。AVFoundationのAPIはほとんど同一です(もちろん意図的に揃えてる)。 面白くないので,あまり本質的ではないですが少し変更しましょう。
iOS 10のAPIを使う
iPhone7 Plusではカメラが増え,AVCaptureDevice.DevicesWithMediaType()
では取得できません。iOS 10で追加された AVCaptureDevice.GetDefaultDevice
か, AVCaptureDeviceDiscoverySession
を使っていきます。
void InitCaptureSession() { session = new AVCaptureSession(); session.SessionPreset = AVCaptureSession.PresetHigh; // iPhone 7 Plusで全てのデバイスを列挙するなら // var deviceTypes = new[] { AVCaptureDeviceType.BuiltInDuoCamera, AVCaptureDeviceType.BuiltInWideAngleCamera, AVCaptureDeviceType.BuiltInTelephotoCamera}; // var discoverySession = AVCaptureDeviceDiscoverySession.Create(deviceTypes, AVMediaType.Video, AVCaptureDevicePosition.Unspecified); // var devices = discoverySession.Devices; var defaultCamera = AVCaptureDevice.GetDefaultDevice(AVCaptureDeviceType.BuiltInWideAngleCamera, AVMediaType.Video, AVCaptureDevicePosition.Front); NSError error; var input = new AVCaptureDeviceInput(defaultCamera, out error); session.AddInput(input); photoOutput = new AVCapturePhotoOutput(); session.AddOutput(photoOutput); }
カメラへのアクセス許可を取得するためにAVCaptureDevice.RequestAccessForMediaType
のほか,iOS10からはInfo.plistに下記記述が必要です。文章は何でもいいです。
あとはmacOSのものからコピペして,NS*
なものをUI*
に置き換えたり,オーバーライドするメソッドをちょこっと変えたりすれば動きます。