//
// 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 :(得分: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