ios, как уменьшить частоту кадров в секунду видеопотока с камеры

#ios #video

#iOS #Видео

Вопрос:

Мне нужно уменьшить частоту кадров видеопотока, поступающего с камеры iPhone.

Это код, который я использую:

 [...]
_captureSession = [[AVCaptureSession alloc] init];
if( [_captureSession canSetSessionPreset:AVCaptureSessionPreset640x480]) {
    [_captureSession setSessionPreset:AVCaptureSessionPreset640x480];
} else {
    NSLog(@"Could not initialize 640x480 video stream");
    exit(EXIT_FAILURE);
}

AVCaptureDevice *videoCaptureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
NSError *error = nil;    

if ([videoCaptureDevice lockForConfiguration:amp;error]) {
    AVCaptureDeviceFormat *format =  [videoCaptureDevice activeFormat];
    NSArray *supportedFPS = format.videoSupportedFrameRateRanges;

    CMTime maxFrameDuration;
    float maxSeconds = FLT_MIN;

    for(AVFrameRateRange *fpsRange in supportedFPS) {
        float currentSeconds = CMTimeGetSeconds(fpsRange.maxFrameDuration);
        if(currentSeconds > maxSeconds) maxFrameDuration =fpsRange.maxFrameDuration;

        NSLog(@"Supported range. Max frame rate: %f (min frame duration %f) -  
                                 Min frame rate: %f (max frame duration %f)",
        fpsRange.maxFrameRate, 
        CMTimeGetSeconds(fpsRange.minFrameDuration),  
        fpsRange.minFrameRate,  
        CMTimeGetSeconds(fpsRange.maxFrameDuration));
    } // for

    NSLog(@"Setting min/max duration for frames to %f", CMTimeGetSeconds(maxFrameDuration));
    [videoCaptureDevice setActiveVideoMaxFrameDuration:maxFrameDuration];
    [videoCaptureDevice setActiveVideoMinFrameDuration:maxFrameDuration];
    [...]
 } // lockForConf
  

Идея состоит в том, чтобы

  • получите текущий формат, после того как установите размер видеопотока;
  • получите массив с доступными диапазонами частоты кадров
  • найдите тот, у которого самая длинная длительность кадра
  • установите минимальную/ максимальную длительность кадра устройства захвата на максимальное значение.

Единственным сообщением журнала, напечатанным в цикле for, является:

 Supported range. Max frame rate: 30.000000 (min frame duration 0.033333) - 
Min frame rate: 2.000000 (max frame duration 0.500000)
  

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

У вас есть какие-нибудь предложения?

Комментарии:

1. Удалось ли вам решить вашу проблему?

2. Я не смог это решить.

Ответ №1:

Вы можете использовать activeVideoMinFrameDuration и activeVideoMaxFrameDuration ACCaptureDevice для обновления кадров сеанса.

Нравится:

 [captureDevice setActiveVideoMaxFrameDuration:CMTimeMake(2, 1)];
[captureDevice setActiveVideoMinFrameDuration:CMTimeMake(2, 1)];
  

Вы также можете обратиться: https://developer.apple.com/documentation/avfoundation/avcapturedevice/1389290-activevideominframeduration