Как использовать AVCaptureSession для потоковой передачи видео в режиме предварительного просмотра, затем сделать фотографию, а затем вернуться к потоковой передаче - PullRequest
7 голосов
/ 10 декабря 2010

У меня есть приложение, которое создает собственный предварительный просмотр перед фотосъемкой.Приложение должно выполнить некоторую обработку данных изображения и, следовательно, не может полагаться на AVCaptureVideoPreviewLayer.Начало работы с исходным потоком идет довольно хорошо, используя пример кода Apple.Проблема возникает, когда я пытаюсь переключиться на более качественное изображение, чтобы сделать снимок.В ответ на нажатие кнопки я пытаюсь перенастроить сеанс для фотографирования в полном разрешении.Я пробовал много вариантов, но вот мой последний пример (который все еще не работает):

- (void)sessionSetupForPhoto
{
 [session beginConfiguration];
 session.sessionPreset = AVCaptureSessionPresetPhoto;
 AVCaptureStillImageOutput *output = [[[AVCaptureStillImageOutput alloc] init] autorelease];
 for (AVCaptureOutput *output in [session outputs]) {
  [session removeOutput:output];
 }
 if ([session canAddOutput:output]){
  [session addOutput:output];
 } else {
  NSLog(@"Not able to add an AVCaptureStillImageOutput");
 }
 [session commitConfiguration];
}

Я последовательно получаю сообщение об ошибке сразу после строки commitConfiguration, которая выглядит следующим образом: (то есть дляскажем, я получаю уведомление AVCaptureSessionRuntimeErrorNotification, отправленное моему зарегистрированному наблюдателю)

Получена ошибка: NSConcreteNotification 0x19d870 {name = AVCaptureSessionRuntimeErrorNotification;объект =;userInfo = {AVCaptureSessionErrorKey = "Ошибка домена = AVFoundationErrorDomain Code = -11800 \" Операция не может быть завершена \ U2019.(Ошибка AVFoundationErrorDomain -11800.) \ "UserInfo = 0x19d810 {}";

Документация в XCode якобы предоставляет дополнительную информацию для номера ошибки (-11800), "AVErrorUnknown - причина ошибки:неизвестно. ";

Ранее я также пробовал вызывать stopRunning и startRunning, но больше не делал этого после просмотра сессии 409 WWDC, где это не рекомендуется.Когда я останавливался и запускался, я получал другое сообщение об ошибке -11819, которое соответствует «AVErrorMediaServicesWereReset - Операция не может быть завершена, поскольку службы мультимедиа стали недоступны», что намного лучше, чем просто «неизвестно», но не обязательнобольше полезно.

Он успешно добавляет AVCaptureStillImageOutput (т. Е. НЕ выдает сообщение журнала).

Я тестирую на iPhone 3g (w / 4.1) и iPhone 4.

Этот вызов происходит в главном потоке, где также произошла моя первоначальная настройка AVCaptureSession.

Как можно избежать ошибки?Как я могу переключиться на более высокое разрешение, чтобы сделать фотографию?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 08 апреля 2011

Поскольку вы обрабатываете видеоданные, поступающие из AVCaptureSession, я предполагаю, что к нему подключен AVCaptureVideoDataOutput до вызова sessionSetupForPhoto.

Если да, можете ли выподробнее о том, что вы делаете в captureOutput: didOutputSampleBuffer: ?Не имея возможности увидеть больше, я предполагаю, что может быть проблема с удалением старых выходов и последующей настройкой предустановки качества фотографии.

Кроме того, переменная output , которую вы используетеВ качестве итератора при удалении выходных данных скрывается неподвижное изображение output .Не проблема, но это делает код немного сложнее для чтения.

1 голос
/ 30 апреля 2012

Нет необходимости переключать сеансы. Просто добавьте AVCaptureStillImageOutput к вашему сеансу при инициализации и вызовите следующее, когда вы собираетесь сделать снимок, и используйте CMSampleBufferRef соответственно:

captureStillImageAsynchronouslyFromConnection:videoConnection
   completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) 
{
}
...