Управление частотой кадров или регулирование AVCaptureVideoPreviewLayer - PullRequest
5 голосов
/ 27 июня 2011

Я использую AVCaptureVideoPreviewLayer, чтобы позволить пользователю делать снимок с камеры iPhone.Таким образом, у меня есть AVCaptureSession с входом как AVCaptureDeviceInput, а выходом - как AVCaptureStillImageOutput.

У меня также есть анимация и элементы управления поверх видеопотока, но они медленные и прерывистые, потому что видео позади работаетпри максимальной частоте кадров и привязке CPU / GPU.

Я бы хотел ограничить частоту кадров AVCaptureVideoPreviewLayer.Я вижу, что есть свойство minFrameDuration в AVCaptureVideoDataOutput, но я не могу найти ничего похожего в AVCaptureVideoPreviewLayer.

1 Ответ

4 голосов
/ 07 ноября 2011

Не думаю, что проблема связана с частотой кадров. Поэтому я предложу несколько советов по улучшению производительности вашего приложения:

1) AVCaptureVideoPreviewLayer это просто подкласс CALayer, который отображает выходные данные с камеры, поэтому невозможно ограничить частоту кадров.

2) Проверьте, правильно ли вы разместили свои анимации в нужном месте, это зависит от того, какие у вас есть анимации, если это CALayer, то слой анимации должен быть подслоем вашего основного слоя просмотра холста (НЕ AVCaptureVideoPreviewLayer !!!) , если это UIView, то это должно быть подпредставление вашего основного вида холста.

3) Вы можете улучшить производительность своего приложения, установив предустановку сеанса:

[captureSession setSessionPreset:AVCaptureSessionPresetLow];

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

4) Я сделал свое собственное тестовое приложение, где случайная анимация перекрывает слой предварительного просмотра видео (но это подпредставление моего основного вида !!!), и все прошло гладко, даже на моем старом iPod, я могу дать вам код для инициализация сеанса захвата:

// Create a capture session
self.captureSession = [AVCaptureSession new];
if([captureSession canSetSessionPreset:AVCaptureSessionPresetHigh]){
    [captureSession setSessionPreset:AVCaptureSessionPresetHigh];
}
else{
    // HANDLE ERROR
}

// Find a suitable capture device
AVCaptureDevice *cameraDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

// Create and add a device input
NSError *error = nil;
AVCaptureDeviceInput *videoInput = [AVCaptureDeviceInput deviceInputWithDevice:cameraDevice error:&error];
if([captureSession canAddInput:videoInput]){
    [captureSession addInput:videoInput];
}
else{
    // HANDLE ERROR
}

// Create and add a device still image output
AVCaptureStillImageOutput *stillImageOutput = [AVCaptureStillImageOutput new];
[stillImageOutput addObserver:self forKeyPath:@"capturingStillImage" options:NSKeyValueObservingOptionNew context:AVCaptureStillImageIsCapturingStillImageContext];
if([captureSession canAddOutput:stillImageOutput]){
    [captureSession addOutput:stillImageOutput];
}
else{
    // HANDLE ERROR
}

// Setting up the preview layer for the camera
AVCaptureVideoPreviewLayer *previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:captureSession];
previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
previewLayer.frame = self.view.bounds;

// ADDING FINAL VIEW layer TO THE CAMERA CANVAS VIEW sublayer
[self.view.layer addSublayer:previewLayer];

// start the session
[captureSession startRunning];

5) И, наконец, в iOS5 вы можете установить минимальную и максимальную частоту кадров видео, что также может улучшить производительность вашего приложения, я думаю, это то, что вы просили. Проверьте эту ссылку (Настройка минимальной и максимальной частоты кадров видео):

http://developer.apple.com/library/mac/#releasenotes/AudioVideo/RN-AVFoundation/_index.html

Надеюсь, что мой ответ был ясен.

С наилучшими пожеланиями,

Артем

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...