简体   繁体   English

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

[英]Capturing video at 60 FPS with the front camera on iPad Pro 9.7"

I am trying to configure the AVCaptureSession to grab frames at 640x480 at 60 FPS with the front camera on iPad Pro 9.7". 我正在尝试将AVCaptureSession配置为使用iPad Pro 9.7“上的前置摄像头以60 FPS抓取640x480的帧。

During the configuration I have these lines: 在配置过程中,我有以下几行:

  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
    }
  }

When I list the video formats supported by the camera I get this list: 当我列出摄像机支持的视频格式时,我得到以下列表:

<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> 

Because I am particularly interested in 640x480, I will want one of these: 因为我对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> 

I choose the first one: 我选择第一个:

<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> 

If I understood this correctly, if I choose this format I can set any frame rate I want between 2 and 60 FPS. 如果我理解正确,那么如果选择这种格式,则可以在2到60 FPS之间设置任何我想要的帧速率。

I choose 60 FPS, by setting these lines: 通过设置以下行,我选择60 FPS:

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

I have even tried this 我什至尝试过

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

Whatever I do, video is always captured at 30 FPS. 无论我做什么,视频总是以30 FPS的速度捕获。

I am setting the capture session with 我正在设置捕获会话

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

Note: I am not particularly interested by 640x480. 注意:我对640x480并不是特别感兴趣。 It only seemed to be the lightest resolution I could think that would make capture faster. 我认为这只是最轻的分辨率,可以使捕获更快。 I would go for any resolution that gives me 60 FPS on the front camera. 我会选择任何可以在前置摄像头上提供60 FPS的分辨率。

How can I do that? 我怎样才能做到这一点?

Thanks 谢谢

The following seems to be incorrect, because bestFrameRateRange!.minFrameDuration would have been 2? 以下内容似乎是不正确的,因为bestFrameRateRange!.minFrameDuration应该是2?

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

Also, are you calling lockForConfiguration before you set the frame duration? 另外,在设置帧持续时间之前是否要调用lockForConfiguration

do {
    try captureDevice!.lockForConfiguration()
    let fps60 = CMTimeMake(value: 1, timescale: 60)
    captureDevice!.activeVideoMinFrameDuration = fps60;
    captureDevice!.activeVideoMaxFrameDuration = fps60;
    captureDevice!.unlockForConfiguration()
} catch {
    // handle error
}

After a couple of days I found the problem. 几天后,我发现了问题。

You cannot use this line 您不能使用此行

self.captureSession.sessionPreset = AVCaptureSession.Preset.vga640x480

after configuring the session or it will undo everything you do to some internal standard. 在配置会话之后,否则它将撤消您对某些内部标准所做的一切。

This line has to be one of the first things you do. 这行必须是您要做的第一件事。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM