Повторное открытие AVCaptureSession

#iphone #ios #cocoa-touch #avfoundation #avcam

#iPhone #iOS #cocoa-touch #avfoundation #avcam

Вопрос:

У меня есть приложение, которое делает несколько снимков. Все мое приложение основано на примере кода AVCam из WWDC 2010. Я много возился с этим, и все же до сих пор я не могу понять, как правильно отключить режим просмотра камеры, который освобождает сеанс камеры…

Все, что я пытаюсь сделать, это следующее:

  • Открыть контроллер просмотра камеры
  • Сделайте несколько фотографий
  • Закрыть контроллер просмотра камеры
  • Откройте его снова

Во второй раз, когда я нажимаю ViewController, сеанс теряется, предварительный просмотр недоступен, а захват также недоступен. Я опубликовал полный пример кода на github.

Мое решение проблемы заключалось в том, чтобы вообще не выпускать камеру, поэтому контроллер просмотра камеры действует как одноэлементный, что, я думаю, неверно. более того, при таком поведении я не мог найти способ поддержки камеры, когда приложение переходит в фоновый режим (например, телефонный звонок).

Пожалуйста, совет. Как мне уничтожить сеанс камеры? и важно ли это делать?

Ответ №1:

Я добавил следующее сообщение в AVCamCaptureManager

 - (void) destroySession {

    if ([delegate respondsToSelector:@selector(captureManagerSessionWillEnd:)]) {
        [delegate captureManagerSessionWillEnd:self];
    }

    // remove the device inputs
    [session removeInput:[self videoInput]];
    [session removeInput:[self audioInput]];

    // release
    [session release];

    // remove AVCamRecorder
    [recorder release];

    if ([delegate respondsToSelector:@selector(captureManagerSessionEnded:)]) {
        [delegate captureManagerSessionEnded:self];
    }
}
  

Я звоню destroySession , когда ViewController, удерживающий камеру, приближается (в моем примере это -closeCamera: of AVCamViewController ).

Для получения полного рабочего примера вы можете загрузить AVCam-CameraReleaseTest на github.com

Комментарии:

1. очень помогло, спасибо. Если вы используете AVCam в качестве modalViewController, вы можете просто вызвать [CaptureManager destroySession] в методе dealloc .

Ответ №2:

G

Я думаю, это может помочь вам взглянуть.

http://red-glasses.com/index.php/tutorials/ios4-take-photos-with-live-video-preview-using-avfoundation/

Комментарии:

1. У меня уже есть приложение, которое захватывает фотографии и сохраняет их в библиотеке… Как я уже писал, проблема в том, как мне правильно закрыть сеанс, чтобы его можно было снова открыть???

2. я также столкнулся с этой проблемой, но где я нашел решение, выполнив эту вещь [session removeInput:input]; input = [AVCaptureDeviceInput deviceInputWithDevice: Ошибка captureDevice: nil]; [session addInput: input]; я удалил предыдущий ввод, а затем добавил новый, это помогает мне выделять каждый раз, когдановый ввод, и я могу каждый раз нажимать на новое изображение при открытии и закрытии камеры, и я сделал это в представлении, а не в одноэлементном классе, и еще одна вещь, которую я не представляю, моделируя вид с камеры, я просто добавляю его, надеюсь, это может вам помочь

3. Спасибо Ballu!! ваш комментарий очень помогает мне решить проблему! Я опубликую полный ответ, как только устраню некоторые проблемы с отображением в моем «VideoPreviewView».

4. Спасибо за ваш ответ. Он действительно выполняет свою работу, НО он также делает некоторые странные вещи: я вызываю его в методе освобождения контроллера. Примерно через секунду после закрытия контроллера (вероятно, вызывается dealloc …) Я получаю примерно 0,5 красного эффекта на верхней панели, как будто произошел какой-то сбой. Есть идеи, почему это происходит?

5. @bashan Просто вызовите его в viewWillDisappear и вызовите сеанс восстановления в viewWillAppear