Как убрать AVCaptureSession в приложении DidEnterBackground? - PullRequest
4 голосов
/ 10 февраля 2011

У меня есть приложение, которое использует AVCaptureSession для обработки видео.Мне нравится писать с нулевыми утечками памяти и правильной обработкой всех объектов.

Вот почему этот пост - Как правильно выпустить AVCaptureSession - был чрезвычайно полезен - С [сессияstopRunning] асинхронный, вы не можете просто остановить сеанс и продолжить освобождать объект удержания.

Итак, это решено.Это код:

// Releases the object - used for late session cleanup
static void capture_cleanup(void* p)
{
    CaptureScreenController* csc = (CaptureScreenController*)p; 
    [csc release];  // releases capture session if dealloc is called
}

// Stops the capture - this stops the capture, and upon stopping completion releases self.
- (void)stopCapture {
    // Retain self, it will be released in capture_cleanup. This is to ensure cleanup is done properly,
    // without the object being released in the middle of it.
    [self retain];

    // Stop the session
    [session stopRunning];

    // Add cleanup code when dispatch queue end 
    dispatch_queue_t queue = dispatch_queue_create("capture_screen", NULL);
    dispatch_set_context(queue, self);
    dispatch_set_finalizer_f(queue, capture_cleanup);
    [dataOutput setSampleBufferDelegate: self queue: queue];
    dispatch_release(queue);
}

Теперь я пришел поддержать прерывания приложений как телефонный звонок или нажатие кнопки «Домой».В случае, если приложение входит в фоновый режим, я бы хотел прекратить захват и открыть свой контроллер представления.

Я не могу сделать это в контексте applicationDidEnterBackground.dealloc никогда не вызывается, мой объект остается живым, и когда я снова открываю приложение, кадры просто начинают поступать автоматически.

Я пытался использовать beginBackgroundTaskWithExpirationHandler, но безрезультатно.Это не сильно изменилось.

Есть предложения?Спасибо!

1 Ответ

0 голосов
/ 16 марта 2011

У меня нет ответа на ваш вопрос. Но я также прочитал ветку , о которой вы упомянули , и пытаюсь это реализовать. Я удивлен, что у вас есть этот код в функции stopCapture:

// Add cleanup code when dispatch queue end 
dispatch_queue_t queue = dispatch_queue_create("capture_screen", NULL);
dispatch_set_context(queue, self);
dispatch_set_finalizer_f(queue, capture_cleanup);
[dataOutput setSampleBufferDelegate: self queue: queue];
dispatch_release(queue);

Я думал, что этот код необходим для инициализации сеанса. Это работает для вас?

Ваша функция capture_cleanup вызывается? мне не звонят, и я пытаюсь понять, почему.

...