2014-01-23 1 views
0

im тестирование простого кода. он использовал AVFoundation. когда я запускаю его. он может сделать снимок и сохранить его в альбоме. но когда я запускаю его дважды, он не работает. я перестроил его и снова работал. но только один раз. может кто-нибудь сказать мне, почему? (Мне очень жаль. Я не очень хорошо на английском ....> <)об 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 (бинарный файл приложения), это сообщение printf. но не делайте фото. Я не знаю, почему. Я написал приложение для местоположения. просто запущен таким же образом. оно работает. Должен ли я добавить что-то в свой 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 (бинарный файл приложения), это сообщение printf. но не делайте фото. Я не знаю, почему. Я написал приложение для местоположения. просто запущен таким же образом. оно работает. Должен ли я добавить что-то в свой info.plist? – JohnSuu