ほぼ開発ブログ

アプリ開発を中心に、いろいろ脱線します。

#015 サンプルアプリを解析する

目標はAV系アプリ

いやいやそっち系じゃなくてさ、Audio & Visual の方ね。写真とか動画とか音楽のアプリを作りたいんだよ。だ〜か〜ら〜、そっち系じゃないんだってば。

… とりま最初は簡単な写真撮影用のカメラアプリから作ってみようと思ってます。動画と音楽には時間の制約があるから、データ構造もプログラムも少し複雑になると思うしw

でも先は長いよ〜、まだサンプルコードを実行しただけで、今レベル 5 だからね。

王様にたったの 50G で「魔王を倒して参れ!」と言われた、勇者オルテガの息子になった気分だw (楽しんでるやん)

サンプルアプリ AVCam

Xamarin は C# でコーディングできるものの、実際には iOSAndroid の仕様をラップしているだけなので、アプリのライフサイクルやAPIなどは各OSに依存します。 それはつまり、iOS アプリも Android アプリも、それぞれの開発スタイルを知る必要があるということになります。

ですが、幸いにも Xamarin や AppleAndroid の開発者サイトには多種多様なサンプルがありますので、作りたい機能の一部を持っているサンプルコードは動く教材としてとても参考になります。

今回は本家 Apple Developer から「AVCam」という、とてもシンプルなサンプルをリモートからプル!しました(しかもラップ調で)

AVCam-iOS: Using AVFoundation to Capture Images and Movies

実はこれ、Xamarin のサンプルもありました。ソースコード中のクラス名、メソッド名やコメント等がほぼ同じだったりしますので、どうやらパク…(ゲホゲホ)、移植のようです。よく見るとアイコンまで一緒ですねw

AVCam - Xamarin

実機で動かしてみて、大まかな機能を把握しました。私の iPhone5 では Live Photo モードは使えないようです、まいっか。(´-ω-`)

AVFoundation

f:id:Kikuzo:20170226095409p:plain

これは Xcode のプロジェクトですが、*.swift ファイルを眺めるといくつか共通のキーワードが見えてきます。

import AVFoundation

import Photos

AVFoundation については、多くの方がブログなどでも書いているようです。

Apple Developer でもこちらがヒットします。

AVFoundation プログラミングガイド

いいね、日本語でちょっと嬉しい。2015年に作成された物なのでちょっと古いけど、初学者には十分使えるね!

ふむふむ、写真を撮るにはどうやら AVCaptureStillImageOutput を使えということか。

あらためて AVCam で AVCaptureStillImageOutput を検索すると… あれっ?ない!?
やっぱ使えねぇw(早くも前言撤回)

… ん?いやあった!けど…?!

– Remove support for AVCaptureStillImageOutput

サポートやめたって、どゆこと?
Apple Developer の API リファレンス を見てみる。→ここ

Important

The AVCaptureStillImageOutput class is deprecated in iOS 10.0 and does not support newer camera capture features such as RAW image output, Live Photos, or wide-gamut color. In iOS 10.0 and later, use the AVCapturePhotoOutput class instead. (The AVCaptureStillImageOutput class remains supported in macOS 10.12.)

AVCaptureStillImageOutput クラスは iOS 10.0 では廃止され、RAW画像出力、ライブ写真、または広域色などの新しいカメラキャプチャ機能はサポートされていません。 iOS 10.0 以降では、代わりにAVCapturePhotoOutput クラスを使用します。(AVCaptureStillImageOutput クラスは、macOS 10.12 でサポートされたままです)

つまり、AVCaptureStillImageOutput は非推奨で、iOS 10.0 以降では新しい機能をサポートする AVCapturePhotoOutput を使いなさいと。

AVCapturePhotoOutput

さらに API リファレンス を見てみる。→ここ

To capture photos with the AVCapturePhotoOutput class, follow these steps:
1. Create an AVCapturePhotoOutput object. Use its properties to determine supported capture settings and to enable certain features (for example, whether to capture Live Photos).
2. Create and configure an AVCapturePhotoSettings object to choose features and settings for a specific capture (for example, whether to enable image stabilization or flash).
3. Capture an image by passing your photo settings object to the capturePhoto(with:delegate:) method along with a delegate object implementing the AVCapturePhotoCaptureDelegate protocol. The photo capture output then calls your delegate to notify you of significant events during the capture process.

AVCapturePhotoOutputクラスを使って写真を取り込むには、次の手順を実行してください:
1. AVCapturePhotoOutputオブジェクトを作成します。そのプロパティを使用して、サポートされているキャプチャ設定を決定し、特定の機能(ライブフォトをキャプチャするかどうかなど)を有効にします。
2. AVCapturePhotoSettingsオブジェクトを作成および設定して、特定のキャプチャの機能および設定を選択します(たとえば、イメージ安定化またはフラッシュを有効にするかどうか)
3. 写真設定オブジェクトをAVCapturePhotoCaptureDelegateプロトコルを実装するデリゲートオブジェクトと共にcapturePhoto(with:delegate:)メソッドに渡して、画像をキャプチャします。写真キャプチャ出力の後、キャプチャプロセス中に重要なイベントを通知するためにデリゲートを呼び出します。

んまぁ、要は何たらのオブジェクト作って、設定して、キャプチャすればええんやろ。(はしょりすぎw)

ほとんどこれらのクラスがやってくれるから、簡単簡単。ミジンコでもできるな。(もしできなければミジンコ以下かw)

… 長くなりそうなので、次回に続きます。(*´∀`)♪

今週借りてきた本

図書館っていいね、開発系の本って買うと何千円もするからね、ありがたや〜(ー人ー)