Я пытаюсь настроить AVCaptureSession
для захвата кадров с разрешением 640x480 при 60 кадрах в секунду с фронтальной камерой на iPad Pro 9,7 ".
Во время настройки у меня есть следующие строки:
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 кадров в секунду.
Я выбираю 60FPS, установив эти строки:
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 на фронтальной камере.
Как можносделать это?
Спасибо