2014-01-23 3 views
0

인스턴트 메신저로 간단한 코드를 테스트했습니다. 그것은 AVFoundation을 사용했습니다. 내가 그것을 달릴 때. 사진을 찍어 앨범에 저장할 수 있습니다. 하지만 두 번 실행하면 효과가 없습니다. 나는 그것을 재건하고 다시 일했다. 그러나 단지 한 번. 왜 누군가가 (미안 해요. 내가 ....> < 영어 잘 모르겠어요)? 말해 줄 수: 내 앱이 처음으로 작업 한 이유는 무엇입니까?

// 
// main.m 
// test 
// 
// Created by John Suu on 1/22/14. 
// Copyright (c) 2014 John Suu. All rights reserved. 
// 

#import <UIKit/UIKit.h> 

#import "AppDelegate.h" 
#import "AVFoundation/AVFoundation.h" 

AVCaptureSession *session; 
AVCaptureDevice *videoDevice; 
AVCaptureDeviceInput *videoInput; 
AVCaptureStillImageOutput *stillImageOutput; 

void settings(){ 

    NSError *error = nil; 

    // 入力と出力からキャプチャーセッションを作成 
    session = [[AVCaptureSession alloc] init]; 

    // 正面に配置されているカメラを取得 
    AVCaptureDevice *camera = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 

    // カメラからの入力を作成し、セッションに追加 
    videoInput = [[AVCaptureDeviceInput alloc] initWithDevice:camera error:&error]; 
    [session addInput:videoInput]; 

    // 画像への出力を作成し、セッションに追加 
    stillImageOutput = [[AVCaptureStillImageOutput alloc] init]; 
    [session addOutput:stillImageOutput]; 

    // キャプチャーセッションから入力のプレビュー表示を作成 

    // セッション開始 
    [session startRunning]; 
} 

void takePicture(){ 

    AVCaptureConnection *videoConnection = [stillImageOutput connectionWithMediaType:AVMediaTypeVideo]; 

    /*if (videoConnection == nil) { 
     return; 
    }*/ 

    // ビデオ入力から画像を非同期で取得。ブロックで定義されている処理が呼び出され、画像データを引数から取得する 
    [stillImageOutput 
    captureStillImageAsynchronouslyFromConnection:videoConnection 
    completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) { 
     if (imageDataSampleBuffer == NULL) { 
      return; 
     } 

     // 入力された画像データからJPEGフォーマットとしてデータを取得 
     NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer]; 

     // JPEGデータからUIImageを作成 
     //[imageData writeToFile:@"/var/mobile" atomically:NO]; 
     UIImage *image = [[UIImage alloc] initWithData:imageData]; 

     // アルバムに画像を保存 


     UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil); 


    }]; 


} 

int main(int argc, char * argv[]) 
{ 

    settings(); 
    takePicture(); 
    // NSTimer *timer = 
    [NSTimer scheduledTimerWithTimeInterval:3 target:nil selector:nil userInfo:nil repeats:NO]; 
    NSLog(@"runing.it works!\n"); 


    @autoreleasepool { 
     return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 
    } 

} 

답변

0

앱이 배경을 지원합니까? 귀하의 코드를 보면 이것이 이유 일 수 있습니다.

기본적으로 앱을 종료하면 배경 모드로 이동합니다. 다시 시작할 때 배경에서 전경으로 이동합니다. 배경 모드 앱이 방금 일시 중지 된 것처럼 main 함수가 다시 호출되지 않습니다. 즉, takePicture 함수는 처음부터 앱을 시작할 때 한 번만 호출됩니다. 앱을 다시 시작하기 전에 앱을 종료 (집을 두 번 클릭) 해보십시오.

이 문제를 해결하려면 그림을 찍는 코드를 AppDelegate 메쏘드로 옮기십시오. 모르겠다면 어떤 것을 읽으시겠습니까? https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html#//apple_ref/doc/uid/TP40007072-CH4-SW3

+0

나는 이것을했지만 작동하지는 않는다. – JohnSuu

+0

그리고 다른 질문이 있습니다. 나는 응용 프로그램을 빌드하고 터미널 명령 ./test(the 응용 프로그램의 바이너리 파일)을 실행하여 메시지를 출력합니다. 그러나 어떤 사진도 찍지 마라. 나는 이유를 모른다. 나는 위치 응용 프로그램을 작성했습니다. 방금 같은 방법으로 시작했습니다. 그것은 작동합니다. 내 info.plist에 뭔가를 추가해야합니까? – JohnSuu

0

addingAdd를 다시 응용 프로그램을 열기 전에 AVCaptureSession을 정지하는 기능을 사용해보십시오.

int main(int argc, char * argv[]) 
    { 

     settings(); 
     takePicture(); 
     stopSession(); 
     // NSTimer *timer = 
     [NSTimer scheduledTimerWithTimeInterval:3 target:nil selector:nil userInfo:nil repeats:NO]; 
     NSLog(@"runing.it works!\n"); 


     @autoreleasepool { 
      return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 
     } 

    } 


void stopSession() { 
     [session stopRunning]; 
} 

문제는 이미 실행중인 세션을 시작하려고하기 때문입니다. 세션을 시작했는지, 이미 실행 중인지 등의 다른 검사도 필요할 수 있습니다. 몇 가지 플래그를 사용하여이를 확인하고 시도하십시오!

+0

저는 제 주 기능에 stopSession()을 추가했습니다. 지금은 완전히 작동하지 않습니다. 아무 일도 없었던 것처럼 응용 프로그램을 시작했습니다. – JohnSuu

+0

그리고 다른 질문이 있습니다. 나는 응용 프로그램을 빌드하고 터미널 명령 ./test(the 응용 프로그램의 바이너리 파일)을 실행하여 메시지를 출력합니다. 그러나 어떤 사진도 찍지 마라. 나는 이유를 모른다. 나는 위치 응용 프로그램을 작성했습니다. 방금 같은 방법으로 시작했습니다. 그것은 작동합니다. 내 info.plist에 뭔가를 추가해야합니까? – JohnSuu

관련 문제