- Date: Fri 16 07 ,2010
- Category: SDK
- Tags: ---
- Response: Comment 11 Trackback 0
iPhone4のLEDフラッシュを使って、ライトを点灯させる方法
[Apple][iPhone][SDK]

久々に、開発のTipsを書いてみたいと思います。
iPhone4にフラッシュが搭載されたので、常時点灯するライトのアプリがたくさんでてますね。ただ、作り方にまずい物が結構あるみたいです。まず、作り方には2種類あります。
◆一つ目の方法(多分、ほととんどこっちだと思います。)
UIKitのUIImagePickerControllerを使う方法です。通常のビデオを撮影できるプログラムを書いて、トーチモードをON(これでライトがつきっぱなしになります。)overlayViewにスイッチのviewをいれてビデオ画面を隠して終わりです。
しかし、この方法だと困ることがあります。ビデオは、音声も録音するのでアプリを起動したとたんiPodなどバックの音楽は停止してしまいます。録音するのですから、あたりまえですね。なので、この方法はおすすめできません。
◆二つ目の方法
iOS 4になって新しいフレームワークが追加されました。AVFoundationといいます。これらのAPIを使えば、新しいタイプのビデオやカメラが作れます。こちらの方では、ビデオなどのインプットと音声のインプットがわかれてますので、音声をインプットしなければ音声処理をしないのでiPodなどのバックの音を停止させることはありません。
私も、ライトアプリだそうと思ったのですがデザインがついて行けずあきらめました。(^^;;
こちらがサンプルコードです。自分で20行もかけば、できてしまいます。w
- (void)viewDidLoad {
[super viewDidLoad];
self.captureSession = [self session];
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[captureSession startRunning];
}
- (void)dealloc {
self.captureSession = nil;
[super dealloc];
}
- (AVCaptureSession *)session {
NSError *error = nil;
AVCaptureDevice *captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
AVCaptureDeviceInput *videoInput = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:&error];
AVCaptureMovieFileOutput *movieFileOutput = [[[AVCaptureMovieFileOutput alloc] init] autorelease];
[captureDevice lockForConfiguration:&error];
captureDevice.torchMode = AVCaptureTorchModeOn;
[captureDevice unlockForConfiguration];
AVCaptureSession *captureSession_ = [[[AVCaptureSession alloc] init] autorelease];
[captureSession_ beginConfiguration];
if ([captureSession_ canAddInput:videoInput]) {
[captureSession_ addInput:videoInput];
}
if ([captureSession_ canAddOutput:movieFileOutput]) {
[captureSession_ addOutput:movieFileOutput];
}
captureSession_.sessionPreset = AVCaptureSessionPresetLow;
[captureSession_ commitConfiguration];
return captureSession_;
}
簡単に説明しますと、AVCaptureSessionが中心にあり、AVCaptureDeviceにデバイスやいろいろなモードの設定(今回は、トーチモードですね。)を設定して、AVCaptureDeviceInputを作ります。さらに、AVCaptureMovieFileOutputを作ります。(これは、AVCaptureStillImageOutputでもかまいません。写真を出力します。)一応アウトプットを設定しないとセッションがうごかないので、便宜上設定してます。
そして、AVCaptureSessionにaddInputしてから、セッションをstartRunningします。最後の方のプリセットは、出力する際のプリセットなのでどれでもOKです。
captureSessionだけプロパティでretainしてます。
注意する点は、デバイスモードを変更するときは、前後にlockとunlockを指定しなければなりません。セッションの変更もCoreAnimation等でおなじみなbeginとcommitの間で変更しましょう。
本当は、これにAVCaptureVideoPreviewLayerをaddSublayerすればビデオ画面がでるのですが、今回はライトをつけるだけなのでいりません。これをビルドすれば、起動したらライトが点灯するアプリのできあがりです。
後マルチタスクにしても意味がないので、Info.plistにApplication does not run in backgroundまたは、UIApplicationExitsOnSuspendどちらかのKeyを追加してチェックをいれてください。これだけでFastAppSwitingはOFFになってサスペンドしなくなります。
今回は、簡単に説明してみました。かなり奥の深いフレームワークなので理解するのがたいへんなのです。まだ、初心者モードからぬけきれません。w
サンプルをちゃんと自分で入力(これ大事ですよ。)して、遊んでみてください!

久々に、開発のTipsを書いてみたいと思います。
iPhone4にフラッシュが搭載されたので、常時点灯するライトのアプリがたくさんでてますね。ただ、作り方にまずい物が結構あるみたいです。まず、作り方には2種類あります。
◆一つ目の方法(多分、ほととんどこっちだと思います。)
UIKitのUIImagePickerControllerを使う方法です。通常のビデオを撮影できるプログラムを書いて、トーチモードをON(これでライトがつきっぱなしになります。)overlayViewにスイッチのviewをいれてビデオ画面を隠して終わりです。
しかし、この方法だと困ることがあります。ビデオは、音声も録音するのでアプリを起動したとたんiPodなどバックの音楽は停止してしまいます。録音するのですから、あたりまえですね。なので、この方法はおすすめできません。
◆二つ目の方法
iOS 4になって新しいフレームワークが追加されました。AVFoundationといいます。これらのAPIを使えば、新しいタイプのビデオやカメラが作れます。こちらの方では、ビデオなどのインプットと音声のインプットがわかれてますので、音声をインプットしなければ音声処理をしないのでiPodなどのバックの音を停止させることはありません。
私も、ライトアプリだそうと思ったのですがデザインがついて行けずあきらめました。(^^;;
こちらがサンプルコードです。自分で20行もかけば、できてしまいます。w
- (void)viewDidLoad {
[super viewDidLoad];
self.captureSession = [self session];
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[captureSession startRunning];
}
- (void)dealloc {
self.captureSession = nil;
[super dealloc];
}
- (AVCaptureSession *)session {
NSError *error = nil;
AVCaptureDevice *captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
AVCaptureDeviceInput *videoInput = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:&error];
AVCaptureMovieFileOutput *movieFileOutput = [[[AVCaptureMovieFileOutput alloc] init] autorelease];
[captureDevice lockForConfiguration:&error];
captureDevice.torchMode = AVCaptureTorchModeOn;
[captureDevice unlockForConfiguration];
AVCaptureSession *captureSession_ = [[[AVCaptureSession alloc] init] autorelease];
[captureSession_ beginConfiguration];
if ([captureSession_ canAddInput:videoInput]) {
[captureSession_ addInput:videoInput];
}
if ([captureSession_ canAddOutput:movieFileOutput]) {
[captureSession_ addOutput:movieFileOutput];
}
captureSession_.sessionPreset = AVCaptureSessionPresetLow;
[captureSession_ commitConfiguration];
return captureSession_;
}
簡単に説明しますと、AVCaptureSessionが中心にあり、AVCaptureDeviceにデバイスやいろいろなモードの設定(今回は、トーチモードですね。)を設定して、AVCaptureDeviceInputを作ります。さらに、AVCaptureMovieFileOutputを作ります。(これは、AVCaptureStillImageOutputでもかまいません。写真を出力します。)一応アウトプットを設定しないとセッションがうごかないので、便宜上設定してます。
そして、AVCaptureSessionにaddInputしてから、セッションをstartRunningします。最後の方のプリセットは、出力する際のプリセットなのでどれでもOKです。
captureSessionだけプロパティでretainしてます。
注意する点は、デバイスモードを変更するときは、前後にlockとunlockを指定しなければなりません。セッションの変更もCoreAnimation等でおなじみなbeginとcommitの間で変更しましょう。
本当は、これにAVCaptureVideoPreviewLayerをaddSublayerすればビデオ画面がでるのですが、今回はライトをつけるだけなのでいりません。これをビルドすれば、起動したらライトが点灯するアプリのできあがりです。
後マルチタスクにしても意味がないので、Info.plistにApplication does not run in backgroundまたは、UIApplicationExitsOnSuspendどちらかのKeyを追加してチェックをいれてください。これだけでFastAppSwitingはOFFになってサスペンドしなくなります。
今回は、簡単に説明してみました。かなり奥の深いフレームワークなので理解するのがたいへんなのです。まだ、初心者モードからぬけきれません。w
サンプルをちゃんと自分で入力(これ大事ですよ。)して、遊んでみてください!