井原プロダクトのBLOG

Since 2013。個人でアプリ作っています。

アプリ第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 (@"消去失敗");
        
    }
}

アプリのデモ動画