うさぎ駆動開発

UWP, Xamarin.Macを中心によしなしごとを書いていきます。

Xamarin.iOS + AVFoundation でフロントカメラからキャプチャする

ここまでMac, UWPとやってきたのでiOSでもやってみます。 リポジトリはこちら。

github.com

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に下記記述が必要です。文章は何でもいいです。 f:id:ailen0ada:20160922124025p:plain

あとはmacOSのものからコピペして,NS*なものをUI*に置き換えたり,オーバーライドするメソッドをちょこっと変えたりすれば動きます。