#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
Я думаю, это может помочь вам взглянуть.
Комментарии:
1. У меня уже есть приложение, которое захватывает фотографии и сохраняет их в библиотеке… Как я уже писал, проблема в том, как мне правильно закрыть сеанс, чтобы его можно было снова открыть???
2. я также столкнулся с этой проблемой, но где я нашел решение, выполнив эту вещь [session removeInput:input]; input = [AVCaptureDeviceInput deviceInputWithDevice: Ошибка captureDevice: nil]; [session addInput: input]; я удалил предыдущий ввод, а затем добавил новый, это помогает мне выделять каждый раз, когдановый ввод, и я могу каждый раз нажимать на новое изображение при открытии и закрытии камеры, и я сделал это в представлении, а не в одноэлементном классе, и еще одна вещь, которую я не представляю, моделируя вид с камеры, я просто добавляю его, надеюсь, это может вам помочь
3. Спасибо Ballu!! ваш комментарий очень помогает мне решить проблему! Я опубликую полный ответ, как только устраню некоторые проблемы с отображением в моем «VideoPreviewView».
4. Спасибо за ваш ответ. Он действительно выполняет свою работу, НО он также делает некоторые странные вещи: я вызываю его в методе освобождения контроллера. Примерно через секунду после закрытия контроллера (вероятно, вызывается dealloc …) Я получаю примерно 0,5 красного эффекта на верхней панели, как будто произошел какой-то сбой. Есть идеи, почему это происходит?
5. @bashan Просто вызовите его в viewWillDisappear и вызовите сеанс восстановления в viewWillAppear