Установите максимальную частоту кадров с помощью AVFoundation в iOS 5 - программирование
Подтвердить что ты не робот

Установите максимальную частоту кадров с помощью AVFoundation в iOS 5

Я полагаю, что это делалось с помощью captureOutput.minFrameDuration. Однако это не рекомендуется в iOS 5.

Вместо этого я, видимо, должен использовать AVCaptureConnection video.minFrameDuration. Итак, у меня есть мой вход, мой вывод, я добавляю их как сеанс захвата - где я могу получить доступ к соединению захвата? Я думаю, что он создан для меня сеансом, но где?

Я мог бы попробовать добавить ввод-вывод с помощью addInputWithNoConnections и addOutputWithNoConnections, а затем, возможно, создать соединение вручную. Но это кажется немного хлопот, чтобы установить максимальную частоту кадров. Кроме того, Xcode жалуется, что эти методы не существуют.

4b9b3361

Ответ 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);