使用iPad Pro 9.7上的前置摄像头以60 FPS捕获视频

时间:2019-02-20 01:15:10

标签: ios avfoundation frame-rate avcapturesession

我正在尝试将AVCaptureSession配置为使用iPad Pro 9.7“上的前置摄像头以60 FPS抓取640x480的帧。

在配置过程中,我有以下几行:

  for videoFormat in (captureDevice?.formats)! {

    let descriptions = videoFormat.formatDescription
    let dimensions = CMVideoFormatDescriptionGetDimensions(descriptions)
    let width = dimensions.width
    let height = dimensions.height

    if ((width != 640) || (height != 480)) {
      continue
    }
    //      let videoFormatDescriptionRef = videoFormat.formatDescription

    for range in videoFormat.videoSupportedFrameRateRanges {
      if range.maxFrameRate == 60 {
        bestFormat = videoFormat
        bestFrameRateRange = range
        break
      }
    }

    if ( bestFormat != nil) {
      captureDevice!.activeFormat = bestFormat!;
      captureDevice!.activeVideoMinFrameDuration = bestFrameRateRange!.minFrameDuration;
      captureDevice!.activeVideoMaxFrameDuration = bestFrameRateRange!.minFrameDuration;
      break
    }
  }

当我列出摄像机支持的视频格式时,我得到以下列表:

<AVCaptureDeviceFormat: 0x282fa1fc0 'vide'/'420v'  192x 144, { 2- 60 fps}, fov:54.400, max zoom:60.00 (upscales @6.67), ISO:34.0-2176.0, SS:0.000013-0.500000, supports HDR> 

<AVCaptureDeviceFormat: 0x282fa1fb0 'vide'/'420f'  192x 144, { 2- 60 fps}, fov:54.400, max zoom:60.00 (upscales @6.67), ISO:34.0-2176.0, SS:0.000013-0.500000, supports HDR, supports wide color> 

<AVCaptureDeviceFormat: 0x282fa1fa0 'vide'/'420v'  352x 288, { 2- 60 fps}, fov:49.895, max zoom:60.00 (upscales @3.33), ISO:34.0-2176.0, SS:0.000013-0.500000, supports HDR> 

<AVCaptureDeviceFormat: 0x282fa1f90 'vide'/'420f'  352x 288, { 2- 60 fps}, fov:49.895, max zoom:60.00 (upscales @3.33), ISO:34.0-2176.0, SS:0.000013-0.500000, supports HDR, supports wide color> 

<AVCaptureDeviceFormat: 0x282fa1f80 'vide'/'420v'  480x 360, { 2- 60 fps}, fov:54.400, max zoom:60.00 (upscales @2.67), ISO:34.0-2176.0, SS:0.000013-0.500000, supports HDR> 

<AVCaptureDeviceFormat: 0x282fa1f70 'vide'/'420f'  480x 360, { 2- 60 fps}, fov:54.400, max zoom:60.00 (upscales @2.67), ISO:34.0-2176.0, SS:0.000013-0.500000, supports HDR, supports wide color> 

<AVCaptureDeviceFormat: 0x282fa1f60 'vide'/'420v'  640x 480, { 2- 60 fps}, fov:54.400, max zoom:60.00 (upscales @2.00), ISO:34.0-2176.0, SS:0.000013-0.500000, supports HDR> 

<AVCaptureDeviceFormat: 0x282fa1f50 'vide'/'420f'  640x 480, { 2- 60 fps}, fov:54.400, max zoom:60.00 (upscales @2.00), ISO:34.0-2176.0, SS:0.000013-0.500000, supports HDR, supports wide color> 

<AVCaptureDeviceFormat: 0x282fa2030 'vide'/'420v'  960x 540, { 2- 60 fps}, fov:58.480, max zoom:48.50 (upscales @1.43), ISO:34.0-2176.0, SS:0.000013-0.500000, supports HDR> 

<AVCaptureDeviceFormat: 0x282fa2040 'vide'/'420f'  960x 540, { 2- 60 fps}, fov:58.480, max zoom:48.50 (upscales @1.43), ISO:34.0-2176.0, SS:0.000013-0.500000, supports HDR, supports wide color> 

<AVCaptureDeviceFormat: 0x282fa2050 'vide'/'420v' 1024x 768, { 2- 60 fps}, fov:54.400, max zoom:60.00 (upscales @1.25), ISO:34.0-2176.0, SS:0.000013-0.500000, supports HDR> 

<AVCaptureDeviceFormat: 0x282fa2060 'vide'/'420f' 1024x 768, { 2- 60 fps}, fov:54.400, max zoom:60.00 (upscales @1.25), ISO:34.0-2176.0, SS:0.000013-0.500000, supports HDR, supports wide color> 

<AVCaptureDeviceFormat: 0x282fa2070 'vide'/'420v' 1280x 720, { 2- 60 fps}, fov:58.480, max zoom:48.50 (upscales @1.08), ISO:34.0-2176.0, SS:0.000013-0.500000, supports HDR> 

<AVCaptureDeviceFormat: 0x282fa2080 'vide'/'420f' 1280x 720, { 2- 60 fps}, fov:58.480, max zoom:48.50 (upscales @1.08), ISO:34.0-2176.0, SS:0.000013-0.500000, supports HDR, supports wide color> 

<AVCaptureDeviceFormat: 0x282fa2090 'vide'/'420v' 1280x 960, { 2- 60 fps}, HRSI:2576x1932, fov:54.400, max zoom:60.00 (upscales @1.00), ISO:34.0-2176.0, SS:0.000013-0.500000> 

<AVCaptureDeviceFormat: 0x282fa20a0 'vide'/'420f' 1280x 960, { 2- 60 fps}, HRSI:2576x1932, fov:54.400, max zoom:60.00 (upscales @1.00), ISO:34.0-2176.0, SS:0.000013-0.500000, supports wide color> 

因为我对640x480特别感兴趣,所以我需要其中之一:

<AVCaptureDeviceFormat: 0x282fa1f60 'vide'/'420v'  640x 480, { 2- 60 fps}, fov:54.400, max zoom:60.00 (upscales @2.00), ISO:34.0-2176.0, SS:0.000013-0.500000, supports HDR> 

<AVCaptureDeviceFormat: 0x282fa1f50 'vide'/'420f'  640x 480, { 2- 60 fps}, fov:54.400, max zoom:60.00 (upscales @2.00), ISO:34.0-2176.0, SS:0.000013-0.500000, supports HDR, supports wide color> 

我选择第一个:

<AVCaptureDeviceFormat: 0x282fa1f60 'vide'/'420v'  640x 480, { 2- 60 fps}, fov:54.400, max zoom:60.00 (upscales @2.00), ISO:34.0-2176.0, SS:0.000013-0.500000, supports HDR> 

如果我正确理解了这一点,那么如果选择这种格式,则可以在2到60 FPS之间设置任何我想要的帧速率。

我通过设置以下几行来选择60 FPS:

  captureDevice!.activeVideoMinFrameDuration = bestFrameRateRange!.minFrameDuration;
  captureDevice!.activeVideoMaxFrameDuration = bestFrameRateRange!.minFrameDuration;

我什至尝试过

let fps60 = CMTimeMake(value: 1, timescale: 60)
captureDevice!.activeVideoMinFrameDuration = fps60;
captureDevice!.activeVideoMaxFrameDuration = fps60;

无论我做什么,视频总是以30 FPS的速度捕获。

我正在设置捕获会话

self.captureSession.sessionPreset = AVCaptureSession.Preset.vga640x480
let captureDevice = AVCaptureDevice.default(.builtInWideAngleCamera, for: AVMediaType.video, position: .front)

注意:640x480对我不是特别感兴趣。我认为这只是最轻的分辨率,可以使捕获更快。我会选择任何可以在前置摄像头上提供60 FPS的分辨率。

我该怎么做?

谢谢

2 个答案:

答案 0 :(得分:0)

以下内容似乎是不正确的,因为bestFrameRateRange!.minFrameDuration应该是2?

captureDevice!.activeVideoMinFrameDuration = bestFrameRateRange!.minFrameDuration;
captureDevice!.activeVideoMaxFrameDuration = bestFrameRateRange!.minFrameDuration;

此外,在设置帧持续时间之前您要打{{1​​}}吗?

lockForConfiguration

答案 1 :(得分:0)

几天后,我发现了问题。

您不能使用此行

self.captureSession.sessionPreset = AVCaptureSession.Preset.vga640x480

在配置会话之后,否则它将撤消您按照某种内部标准执行的所有操作。

此行必须是您要做的第一件事。