- 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
サンプルをちゃんと自分で入力(これ大事ですよ。)して、遊んでみてください!
Comments

大変参考にさせて頂きました!マイクの音量を取りたく、方法を探っていました。ありがとうございます!
今回、ブログを参考にAVCaptureTorchModeの勉強をしています。
画面にボタンを配置して、
オンオフで光をAVCaptureTorchModeOn、AVCaptureTorchModeOffに入れ変えたいのですが、
-(void)lighton:(id)sender {
[self.captureSession startRunning];
}
-(void)lightoff:(id)sender {
[self.captureSession stopRunning];
}
こういう設定ではうまくいきません、、
何か参考になるページや、本など教えていただけると嬉しいです。
どうぞよろしくお願いいたします。
画面にボタンを配置して、
オンオフで光をAVCaptureTorchModeOn、AVCaptureTorchModeOffに入れ変えたいのですが、
-(void)lighton:(id)sender {
[self.captureSession startRunning];
}
-(void)lightoff:(id)sender {
[self.captureSession stopRunning];
}
こういう設定ではうまくいきません、、
何か参考になるページや、本など教えていただけると嬉しいです。
どうぞよろしくお願いいたします。
-(void)lighton:(id)sender {
[self.captureSession startRunning];
NSError *error = nil;
AVCaptureDevice *captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
[captureDevice lockForConfiguration:&error];
captureDevice.torchMode = AVCaptureTorchModeOn;
[captureDevice unlockForConfiguration];
}
-(void)lightoff:(id)sender {
NSError *offerror = nil;
AVCaptureDevice *offcaptureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
[offcaptureDevice lockForConfiguration:&offerror];
offcaptureDevice.torchMode = AVCaptureTorchModeOff;
[offcaptureDevice unlockForConfiguration];
}
こうやって、モードを切り替えたら
希望の動きができました!
>デバイスモードを変更するときは、前後にlockとunlockを指定しなければなりません
ここの意味が分かりました。
ありがとうございます!
[self.captureSession startRunning];
NSError *error = nil;
AVCaptureDevice *captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
[captureDevice lockForConfiguration:&error];
captureDevice.torchMode = AVCaptureTorchModeOn;
[captureDevice unlockForConfiguration];
}
-(void)lightoff:(id)sender {
NSError *offerror = nil;
AVCaptureDevice *offcaptureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
[offcaptureDevice lockForConfiguration:&offerror];
offcaptureDevice.torchMode = AVCaptureTorchModeOff;
[offcaptureDevice unlockForConfiguration];
}
こうやって、モードを切り替えたら
希望の動きができました!
>デバイスモードを変更するときは、前後にlockとunlockを指定しなければなりません
ここの意味が分かりました。
ありがとうございます!
>pankoさん
返事が遅くなってしまって申し訳ありません。
解決しましたね。流石です!
おっしゃる通りでモードを変更するときは割り込みをしなければならないので
必ず
[offcaptureDevice lockForConfiguration:&offerror];
offcaptureDevice.torchMode = AVCaptureTorchModeOff;
[offcaptureDevice unlockForConfiguration];
こういった感じでロックとアンロックをはさみます。
こういったパターンはテーブルビューや他の場合も変更するとき似たようなことで使われることがあるので覚えていた方が良いですね。
がんばってアプリ作ってくださいね!(^^)/
使われることがあるので
返事が遅くなってしまって申し訳ありません。
解決しましたね。流石です!
おっしゃる通りでモードを変更するときは割り込みをしなければならないので
必ず
[offcaptureDevice lockForConfiguration:&offerror];
offcaptureDevice.torchMode = AVCaptureTorchModeOff;
[offcaptureDevice unlockForConfiguration];
こういった感じでロックとアンロックをはさみます。
こういったパターンはテーブルビューや他の場合も変更するとき似たようなことで使われることがあるので覚えていた方が良いですね。
がんばってアプリ作ってくださいね!(^^)/
使われることがあるので
初めまして。全くの初心者です。
iPhoneのLEDを点滅させたくてネット検索していたところこちらにたどり着きました。
とりあえず「点灯」してみたいのですが、掲載されているプログラムをどこにコピペすればよいのでしょうか?
Xcode4を使ってStoryboardで画面表示程度はできています。
On/OffスイッチでOnのときに点灯させるにはどうすればよいでしょうか?
ViewController.mのなかに
- (IBAction)chnageSW:(id)sender {
if (mySW.on == YES) {
myLabel.text = @"オン";
} else {
myLabel.text = @"オフ";
}
}
でOn/Offスイッチの切り替えで「オン」「オフ」表示するようにしています。
ここのどこかにコピペすればよいのでしょうか?
お手数をおかけ言い足しますが、ご教授お願いいたします。
iPhoneのLEDを点滅させたくてネット検索していたところこちらにたどり着きました。
とりあえず「点灯」してみたいのですが、掲載されているプログラムをどこにコピペすればよいのでしょうか?
Xcode4を使ってStoryboardで画面表示程度はできています。
On/OffスイッチでOnのときに点灯させるにはどうすればよいでしょうか?
ViewController.mのなかに
- (IBAction)chnageSW:(id)sender {
if (mySW.on == YES) {
myLabel.text = @"オン";
} else {
myLabel.text = @"オフ";
}
}
でOn/Offスイッチの切り替えで「オン」「オフ」表示するようにしています。
ここのどこかにコピペすればよいのでしょうか?
お手数をおかけ言い足しますが、ご教授お願いいたします。
初心者の質問で失礼します。
ライト点灯を行いたくHPを拝見させてもらいました。
新規アプリを作成(ViewController)したあと
「self.captureSession = [self session];」
を記述した時点で
「 Property 'captureSession' not found on object of type 'ViewController *'; did you mean to access instance variable 'captureSession'?」
のエラーが出ました。
(AVFoundationのlink設定などは行いました。)
一度ご教授いただけないでしょうか?。
また開発環境などでの問題があるのであれば
もし可能であればサンプルを頂けないでしょうか。
プログラム開始1ヶ月の者です。
失礼な内容であればお許しください。
環境:MacBook Air OS X 10.8.2
xcode Ver4.6
ライト点灯を行いたくHPを拝見させてもらいました。
新規アプリを作成(ViewController)したあと
「self.captureSession = [self session];」
を記述した時点で
「 Property 'captureSession' not found on object of type 'ViewController *'; did you mean to access instance variable 'captureSession'?」
のエラーが出ました。
(AVFoundationのlink設定などは行いました。)
一度ご教授いただけないでしょうか?。
また開発環境などでの問題があるのであれば
もし可能であればサンプルを頂けないでしょうか。
プログラム開始1ヶ月の者です。
失礼な内容であればお許しください。
環境:MacBook Air OS X 10.8.2
xcode Ver4.6
>ヒロッシさん
コメントありがとうございます!
プロパティがないのでcaptureSessionにアクセスできませんということですね。
エラーの英語を翻訳して意味を理解できるとこれからもがんばれますよ。
(ちなみに僕も英語は苦手でした)
.hファイルに以下を追加してください。
@property(nonatomic,retain) AVCaptureSession *captureSession;
そして、
.mファイルに以下も追加してください。
@synthesize captureSession;
これはプロパティといって外部からのアクセスするための機能を追加するためのものです。詳しくは「プロパティ」でぐぐって調べてみてください。
メールアドレスを教えて頂ければ、まだ、LEDがオンオフできる作ったサンプルが残っていたので差し上げますよ。
コメントありがとうございます!
プロパティがないのでcaptureSessionにアクセスできませんということですね。
エラーの英語を翻訳して意味を理解できるとこれからもがんばれますよ。
(ちなみに僕も英語は苦手でした)
.hファイルに以下を追加してください。
@property(nonatomic,retain) AVCaptureSession *captureSession;
そして、
.mファイルに以下も追加してください。
@synthesize captureSession;
これはプロパティといって外部からのアクセスするための機能を追加するためのものです。詳しくは「プロパティ」でぐぐって調べてみてください。
メールアドレスを教えて頂ければ、まだ、LEDがオンオフできる作ったサンプルが残っていたので差し上げますよ。
AppleWalkerさん
ご回答有難うござます!
メールアドレスを記入しました
ので宜しくお願いします。
m(_ _)m
zxingの二次元バーコード
サンプルアプリにライト点灯
をつけてみたくお願いしました。
正直、初心者には厳しいです。
(O_O)
ご回答有難うござます!
メールアドレスを記入しました
ので宜しくお願いします。
m(_ _)m
zxingの二次元バーコード
サンプルアプリにライト点灯
をつけてみたくお願いしました。
正直、初心者には厳しいです。
(O_O)