AVFoundationを使った無音カメラアプリの作り方

名古屋第17回iPhoneアプリ開発者勉強会で、iOSカメラアプリ開発入門(第2回)ということで、「AVFoundationを使った無音カメラアプリの作り方」というテーマでレクチャーしてきました。

その後は、飲み会だったのですが、Andoroid開発の話や、当日アプリの音作りをレクチャーしてくれたサウンドクリエイターさんが、DJ仲間のヒエイさんと同じ地元の友達だったりとか、なかなか楽しい飲み会でした。

勉強会について

前回は初心者向けでかなーりゆっくりやったのですが今回は実機転送ができる中級者以上が対象ということで、それなりのペースでやることができました。

まずは僕が作ったAVFoundationで簡単に撮影できるクラスライブラリ、CameraManagerの使い方と、それがどうやって動いているかの仕組みを説明しながらAVFoundationについて理解していくという段取りでやりました。

勉強会に来られなかった方で、AVFoundationに興味があるけど難しくて困っている人が多いと思うのでクラスライブラリの使い方だけブログでも軽く説明しときます。AVFoundationへの理解が全くなくても、このクラスを使えば、無音カメラアプリくらいならサクっと作れます。

プロジェクトは

http://takatronix.com/tutorial/20130629.zip

当日のスライド

PDFのダウンロードはこちら

CameraManagerの使い方

撮影したViewControllerのメンバにCameraManagerを追加します

@interface ViewController : UIViewController
@property CameraManager*          cameraManager;  //   カメラマネージャクラス
@end

初期化

- (void)viewDidLoad
{
[super viewDidLoad];

// カメラクラスを初期化
_cameraManager = CameraManager.new;
//_cameraManager.delegate = self;

// プレビューレイヤを設定
[_cameraManager setPreview:_previewView];
}

プレビューが欲しいときは貼り付けたいUIViewを指定。ビデオ画像を毎フレーム欲しい時はdelegateを指定する。
デフォルトは640×480の解像になっています。解像度を指定したい場合はCaptureSessionPresetを指定してください。

[_cameraManager = [[CameraManager alloc] initWithPreset:AVCaptureSessionPreset1920x1080];

静止画の取得(シャッター音あり)

-(IBAction)photo:(id)sender{
[_cameraManager takePhoto:^(UIImage *image, NSError *error) {
_captureview.image = image;
}];
}

静止画の取得(シャッター音なし)

-(IBAction)video:(id)sender{
_captureview.image = _cameraManager.rotatedVideoImage;
}

カメラ制御

// バックカメラを使う
-(IBAction)back:(id)sender{
[_cameraManager useFrontCamera:NO];
}
// フロントカメラを使う
-(IBAction)front:(id)sender{
[_cameraManager useFrontCamera:YES];
}
// カメラ切り替え
-(IBAction)flip:(id)sender{
[_cameraManager flipCamera];
}

ライト制御

// ライト切り替え
-(IBAction)light:(id)sender{
[_cameraManager lightToggle];
}
// ライトON
-(IBAction)lightOn:(id)sender{
[_cameraManager light:YES];
}
// ライトOFF
-(IBAction)lightOff:(id)sender{
[_cameraManager light:NO];
}

リアルタイムエフェクトを使いたいとき

プレビューを使わずにリアルタイムでエフェクトを確認したいときはdelegateを指定し、以下のメソッドを用意しておくと1/30秒毎にCGImageRefに変換した画像を通知してくれます。向きは回転していないので自分で加工すること。以下のサンプルは白黒フィルタを適用してUIImageViewに表示しているサンプルです。

-(void)videoFrameUpdate:(CGImageRef)cgImage from:(CameraManager*)manager{

UIImage* imageRotate = [CameraManager rotateImage:[UIImage imageWithCGImage:cgImage] angle:270];
if(manager.isUsingFrontCamera)
imageRotate = [self mirrorImage:imageRotate];

_previewView.image = [self monochromeFilter:imageRotate];
}

とまぁ、難解なAVFoundationを全く理解せずともAVFoundationを使えるクラスの使い方でした。使いたい人は自由に使ってください。使い方はCameraManager.hを見てください。

次回、7月中旬に行われる、名古屋iPhone開発者勉強会では、初心者〜中級者向けに「画像加工のいろは」について、かなり役立つTipsをお伝えしていこうと思っています。

最近、あまりブログ更新してなかったので、これからはプログラミングTipsとかぼちぼちアップしていきますので、興味ある人はTwitterフォローよろしくです。

 

AVFoundationを勉強するならおすすめの一冊

iOS4プログラミングブック
畑 圭輔 加藤 寛人 坂本 一樹 藤川 宏之 高橋 啓治郎 沖田 知彦 柳澤 昇
インプレスジャパン
売り上げランキング: 302,631

One comment

  • 初心者です。

    さいれんとカメラのリアルタイムエフェクトを試みたのですができませんでした。

    //_cameraManager.delegate = self;をコメントアウトして、

    ここもコメントアウトしました。
    UIImage* imageRotate = [CameraManager rotateImage:[UIImage imageWithCGImage:cgImage] angle:270];
    if(manager.isUsingFrontCamera)
    imageRotate = [self mirrorImage:imageRotate];
    _previewView.image = [self monochromeFilter:imageRotate];

    原因が分からないので、何も設定せずに使えるようにしていただけないでしょうか?

Leave a Reply

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です