关于AVFoundation:为什么我的应用程序刚刚第一次工作

时间:2014-01-23 14:43:44

标签: ios iphone objective-c avfoundation jailbreak

我正在测试一个简单的代码。它使用了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]));
  }

}

2 个答案:

答案 0 :(得分:0)

尝试添加添加一个在再次打开应用程序之前停止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];
}

问题是因为您正在尝试启动已在运行的会话。很少有其他检查也需要,例如会话是否已启动,已经运行等。扔几个标志来检查并试试!

答案 1 :(得分:0)

您的应用是否支持后台处理?看看你的代码,这可能是原因。

默认情况下退出应用时,它将以后台模式移动。当您再次启动它时,它将从背景移动到前景。您的main功能将不再被调用,因为在后台模式应用程序刚刚暂停。这意味着当您从头开始启动应用时,takePicture功能只会被调用一次。尝试关闭您的应用程序(双击主页),然后再次启动它。

要解决这个问题,只需将带有图片的代码移到AppDelegate方法中即可。如果您不知道哪些,请阅读此https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html#//apple_ref/doc/uid/TP40007072-CH4-SW3