Установите максимальную частоту кадров с помощью AVFoundation в iOS 5
Я полагаю, что это делалось с помощью captureOutput.minFrameDuration
. Однако это не рекомендуется в iOS 5.
Вместо этого я, видимо, должен использовать AVCaptureConnection
video.minFrameDuration
. Итак, у меня есть мой вход, мой вывод, я добавляю их как сеанс захвата - где я могу получить доступ к соединению захвата? Я думаю, что он создан для меня сеансом, но где?
Я мог бы попробовать добавить ввод-вывод с помощью addInputWithNoConnections
и addOutputWithNoConnections
, а затем, возможно, создать соединение вручную. Но это кажется немного хлопот, чтобы установить максимальную частоту кадров. Кроме того, Xcode жалуется, что эти методы не существуют.
Ответы
Ответ 1
Крис, я думаю, что решил эту проблему:
(Редактировать - см. комментарий Томаса Камина ниже о правильном способе проверки того, поддерживаются ли видеоМинформация VideoMaxFrameDuration, хотя ниже код работал нормально при публикации)
В приведенной ниже строке показан доступ к объекту AVCaptureConnection
, связанному с объектом AVCaptureVideoDataOutput
:
AVCaptureConnection *conn = [output connectionWithMediaType:AVMediaTypeVideo];
CMTimeShow(conn.videoMinFrameDuration);
CMTimeShow(conn.videoMaxFrameDuration);
if (conn.isVideoMinFrameDurationSupported)
conn.videoMinFrameDuration = CMTimeMake(1, CAPTURE_FRAMES_PER_SECOND);
if (conn.isVideoMaxFrameDurationSupported)
conn.videoMaxFrameDuration = CMTimeMake(1, CAPTURE_FRAMES_PER_SECOND);
CMTimeShow(conn.videoMinFrameDuration);
CMTimeShow(conn.videoMaxFrameDuration);
Если вы используете (как я есть) делегат didOutputSampleBuffer
, вы можете подтвердить, что частота кадров видео в значении fromConnection
AVCaptureConnection *, переданном делегату, была правильно установлена и "запомнена" приведенный выше код.
Обратите внимание, что вам нужно установить как videoMinFrameDuration
, так и videoMaxFrameDuration
на одно и то же значение, чтобы успешно закрепить частоту кадров - установка min сама по себе не срабатывала при тестировании на Айфон 4С. Это, похоже, не документировано.
Джош
Ответ 2
AVCaptureConnection
videoMinFrameDuration
устарел. Используйте AVCaptureDevice
activeVideoMinFrameDuration
/activeVideoMaxFrameDuration
. Первый фрагмент кода в AVCaptureDevice класс ссылается на вопрос.
Ответ 3
Предположим, что следующие члены.
AVCaptureConnection *videoConnection;
AVCaptureVideoDataOutput *videoOutput;
AVCaptureDeviceInput *videoInput;
Тогда вы сделаете что-то вроде следующего. Я не тестировал это. Это просто предположение от чтения документов.
AVCaptureDevice *videoDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
if ( videoDevice ) {
NSError *error;
videoInput = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:&error];
[captureSession addInput:videoInput];
}
videoOutput = [[AVCaptureVideoDataOutput alloc] init];
//setup video options
if ([captureSession canAddOutput:videoOutput])
[captureSession addOutput:videoOutput];
videoConnection = [[AVCaptureConnection alloc] initWithInputPorts:captureSession.inputs output:videoOutput];
videoConnection.videoMinFrameDuration = CMTimeMake(1, frameRate);
[captureSession addConnection:videoConnection];
Я еще не преобразовал свой собственный код. Когда я сделаю конверсию, я вернусь к рабочему коду. Если у вас есть несколько входов, добавленных в captureSession, вам может потребоваться явно загрузить тот, который вы хотите в массив. например.
ports = [NSArray arrayWithObject:videoInput];
Затем передайте это в инициализатор для AVCaptureConnection.
Ответ 4
Как упоминалось Киран, AVCaptureConnection videoMinFrameDuration
устарел с iOS 7.
Чтобы быть более конкретным, "обновление" Пример Apple:
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
AVCaptureDeviceInput *input = ... // Following the example
// ** Create and Configure the Video Data Output **
AVCaptureVideoDataOutput *output = [[AVCaptureVideoDataOutput alloc] init];
[session addOutput:output];
output.videoSettings = @{
(NSString *)kCVPixelBufferPixelFormatTypeKey : @(kCVPixelFormatType_32BGRA)
};
device.activeVideoMinFrameDuration = CMTimeMake(1, 15);