1

iPhone 4/4S用のパスワードアプリを作っています。ユーザーがパスワードの入力に 3 回失敗した場合、iPhone の前面カメラを使用してユーザーのムービーを作成したいと思います。これは新しいことではなく、アプリストアの多くのアプリが同様のことを行っています。男の写真を撮り、GEO 座標などを取得します。

私が直面している課題は、映画の録画をセットアップしようとすると、カメラのオーバーレイが画面全体を占有することです。私が本当にやりたいことは、ユーザーにログイン画面とボタンを表示させながら、密かにユーザーの動画を記録して作成することです。これを行う方法はありますか?

これは私が使用しているコードです。

私の *.h ファイルで

@interface v1InstantController : UIViewController <UIImagePickerControllerDelegate>
{   
    UIImagePickerController *picpicker;
}

@property (nonatomic, retain) UIImagePickerController *picpicker;

私の *.m ファイルで

-(IBAction) makeMovieNow
{
    picpicker = [[UIImagePickerController alloc] init];
        picpicker.delegate = self;


        picpicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
        picpicker.sourceType = UIImagePickerControllerSourceTypeCamera;

        picpicker.showsCameraControls = NO;
        picpicker.navigationBarHidden = YES;
        picpicker.wantsFullScreenLayout = NO;

        picpicker.mediaTypes = [NSArray arrayWithObject:(NSString *)kUTTypeMovie];
        picpicker.cameraCaptureMode = UIImagePickerControllerCameraCaptureModeVideo;

        picpicker.cameraFlashMode = UIImagePickerControllerCameraFlashModeOff;
        picpicker.cameraDevice = UIImagePickerControllerCameraDeviceFront;

        picpicker.videoQuality = UIImagePickerControllerQualityTypeHigh;

        picpicker.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];

        //The problem is right here! 
        //picpicker.cameraViewTransform = CGAffineTransformScale(picpicker.cameraViewTransform, 0.01, 0.01);
        [self presentModalViewController:picpicker animated:YES];

        [picpicker startVideoCapture];
}

問題はここにある「presentModalViewController:picpicker」です。これを使用すると、アイリススプラッシュなどでカメラ画面が起動し、画面全体に何が記録されているかが表示されます。cameraViewTransform を使用しても、ページ上のすべてが無効になり、このカメラ オーバーレイがページの中央に配置されます。(非常に小さなカメラ オーバーレイを使用して) 私が録画していることをユーザーに知られたくないので、いつも通りのビジネスだと思ってもらいたいのです。つまり、彼がページでパスワードを入力しようとして失敗し続けるようにします。

4

2 に答える 2

5

UIImagePickerController は、あまり手間をかけずにユーザーから写真/ビデオを取得する手段を提供するため、常にユーザーに表示されます。

より多くの制御が必要なようですので、AVFoundation を見ることができます。Apple ドキュメンテーションは良い出発点を提供するはずです。

于 2012-08-16T13:54:39.327 に答える
0

将来に興味があるかもしれない人のための答えはここにあります。それを評価してください!

coreVideo および CoreMedia フレームワークを必ず含めてください

*.h ファイルに

@interface v1InstantController : UIViewController <UIImagePickerControllerDelegate,UINavigationControllerDelegate>
{
    AVCaptureSession *session;
    NSString *videoPath2;
}

@property (nonatomic, retain) AVCaptureSession *session;
@property (nonatomic, retain) NSString *videoPath2;

*.m ファイルに

@synthesize session;
@synthesize videoPath2;

-(IBAction) makeMovieNow
{

    NSLog(@"makeMovieNow ..");

    //record movie
    session = [[AVCaptureSession alloc] init];
    [session beginConfiguration];
    session.sessionPreset = AVCaptureSessionPresetHigh;

    AVCaptureVideoPreviewLayer *captureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];
    captureVideoPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;


    NSError *error = nil;
    AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    device = [self frontFacingCameraIfAvailable];
    AVCaptureDeviceInput *videoInput = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];
    if (!videoInput) 
    {
        // Handle the error appropriately.
        NSLog(@"ERROR: trying to open camera: %@", error);
    }

    AVCaptureDevice *audioDevice     = [AVCaptureDevice defaultDeviceWithMediaType: AVMediaTypeAudio];
    AVCaptureDeviceInput *audioInput = [AVCaptureDeviceInput deviceInputWithDevice:audioDevice error:&error ]; 


    AVCaptureMovieFileOutput *movieFileOutput = [[AVCaptureMovieFileOutput alloc] init];

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectoryPath = [paths objectAtIndex:0];
    NSString *movieFileName = [NSString stringWithFormat: @"Secret.mov"];
    NSString *fullPathToFile2 = [documentsDirectoryPath stringByAppendingPathComponent:movieFileName];
    NSURL *outputURL = [[NSURL alloc] initFileURLWithPath:fullPathToFile2];

    videoPath2=[outputURL path];


    [session addInput:videoInput];
    [session addInput:audioInput];
    [session addOutput:movieFileOutput];
    [session commitConfiguration];

    //start recording
    [session startRunning];
    [movieFileOutput startRecordingToOutputFileURL:outputURL recordingDelegate:self];
}

-(IBAction) makeMovieStop
{
    NSLog(@"makeMovieStop ...");

    //stop recording
    [session stopRunning];

    //save video to photo-album
    UISaveVideoAtPathToSavedPhotosAlbum(videoPath2, self, nil, nil);

}
于 2012-08-16T16:44:24.587 に答える