アプリ第4弾「練習カメラ」リリース
簡単操作の練習用カメラアプリができました!!
ピアノを練習していて、もっと簡単に録画再生ができないものか?といつも考えていました。iPhoneの標準のカメラを使うと「録画開始=>再生=>カメラに戻る」という一連の操作を行うには、6回の画面タップが必要です。録画の度にこれでは、練習の集中が途切れてしまいます。しかも、撮った動画がどんどん保存されてしまうので、後で消さないといけません。
そんな面倒を解決したい!というので生まれたのが「練習カメラ」。これは、同じ操作をするのに1回も画面をタップする必要がありません。操作はiPhoneに手をかざすだけ。
一度かざすと録画開始、もう一度かざすと録画停止、そして自動再生が始まります、終わったら手をかざして録画待機画面に。保存したいときだけ「保存」をタップする様になっています。これは切符がSUICAに変わった以来の大改革です(笑)。
無料ですので、iPhoneユーザの方はぜひお試しください。
また、アプリからピアノの横にiPhoneを設置できるスタンドをご購入いただけるようになっています。こちらもぜひよろしくお願いします。
技術的には、近接センサーを使っています。これ、ちょっと動作に癖があって、意外と実装には苦労しました。横向きでは動かないとか、Event発生にはON/OFFがあって、ONの状態で近接センサーをdisableにすると、次はOFFになったときしか検知しないとか。かといってずっとenableのままだと妙に感度が良くて、Video側の処理を待たずしてStatusが変わってダウンするとか、、。
それから、iPADには近接センサーがないため、同じ動作事はできないのですが、Appleの規定上、iPhoneアプリはiPADでも動かないといけないため(実際、一度リジェクトされました。動かないアプリは結構あるんだけど、文句言っても仕方ない、、、)iPADでは手をかざすという動作ではなく、画面のどこかを触ってもらうことにしています。透明ボタンを画面いっぱいに配置しています。
また、UIImagePickerControllerで撮った動画は、明示的に消さないと消えません。これも想定外でした。ずっと保存されていくので、カメラ終了時、またアプリを落としたときなどのタイミングで、消去しないといけません。
@interface ViewController () NSString *pathToVideo; - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { NSURL *videoURL = [info valueForKey:UIImagePickerControllerMediaURL]; <span class="deco" style="color:#FF0000;"> pathToVideo = [videoURL path]; </span> //PickerControllerを閉じる [self dismissViewControllerAnimated:YES completion:nil]; // 取った画像の再生 NSURL *url = [info valueForKey:UIImagePickerControllerMediaURL]; playerItem = [[AVPlayerItem alloc] initWithURL:url]; [playerItem addObserver:self forKeyPath:@"status" options:0 context:&ItemStatusContext]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playerItemDidReachEnd:) name:AVPlayerItemDidPlayToEndTimeNotification object:playerItem]; player = [AVPlayer playerWithPlayerItem:playerItem]; [playerView setPlayer:player]; //再生開始 [player play]; } -(void) deleteFile { //ここで録画したファイルを消す NSFileManager *fileManager = [NSFileManager defaultManager]; if ([fileManager fileExistsAtPath:pathToVideo]) { NSError *error; // Attempt to delete the folder containing globalDel.videoPath if ([fileManager removeItemAtPath:[pathToVideo stringByDeletingLastPathComponent] error:&error] != YES) { NSLog(@"Unable to delete file: %@", [error localizedDescription]); }else{ NSLog (@"消去成功"); } } else { NSLog (@"消去失敗"); } }
アプリのデモ動画