Подтвердить что ты не робот

Знание разрешения предварительных настроек сеанса AVCaptureSession

Я обращаюсь к камере в iOS и использую предварительные настройки сеанса так:

captureSession.sessionPreset = AVCaptureSessionPresetMedium;

Довольно стандартный материал. Тем не менее, я бы хотел заранее узнать разрешение видео, которое я получаю из-за этой предустановки (особенно потому, что в зависимости от устройства это будет по-другому). Я знаю, что есть таблицы в Интернете, вы можете посмотреть это (например, здесь: http://cmgresearch.blogspot.com/2010/10/augmented-reality-on-iphone-with-ios40.html). Но я хотел бы получить это программно, чтобы я не просто полагался на магические числа.

Итак, что-то вроде этого (теоретически):

[captureSession resolutionForPreset:AVCaptureSessionPresetMedium];

который может вернуть CGSize (ширина: 360, высота: 480). Мне не удалось найти какой-либо такой API, до сих пор мне приходилось прибегать к ожиданию, чтобы получить мое первое захваченное изображение и запросить его тогда (что по другим причинам в моем потоке программы не очень хорошо).

4b9b3361

Ответ 1

По словам Apple, для этого нет API. Это отстой, у меня была та же проблема.

Ответ 2

Я не AVFoundation pro, но я думаю, что путь:

captureSession.sessionPreset = AVCaptureSessionPresetMedium;
AVCaptureInput *input = [captureSession.inputs objectAtIndex:0]; // maybe search the input in array
AVCaptureInputPort *port = [input.ports objectAtIndex:0];
CMFormatDescriptionRef formatDescription = port.formatDescription;
CMVideoDimensions dimensions = CMVideoFormatDescriptionGetDimensions(formatDescription);

Я не уверен в последнем шаге, и я сам не пробовал. Просто нашел, что в документации и думаю, что он должен работать.

Поиск CMVideoDimensions в Xcode вы найдете пример проекта RosyWriter. Посмотрите на этот код (у меня нет времени на это делать).

Ответ 3

FYI, я прикладываю здесь официальный ответ от Apple.


Это продолжение с идентификатором ошибки # 13201137.

Инженерия определила, что эта проблема ведет себя как предполагалось на основе следующей информации:

Есть несколько проблем с включенным кодом:

1) У AVCaptureSession нет входных данных. 2) AVCaptureSession не имеет выходов.

Без хотя бы одного входа (добавленного в сеанс с использованием [AVCaptureSession addInput:]) и совместимого выхода (добавленного с помощью [AVCaptureSession addOutput:]), активных подключений не будет, поэтому сеанс фактически не будет запущен в устройстве ввода. Для этого нет необходимости - нет никаких выходов для передачи каких-либо данных камеры.

3) Класс JAViewController предполагает, что свойство video port -formatDescription будет не равно нулю, как только [AVCaptureSession startRunning] вернется.

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

Вы просто слишком быстро запрашиваете. Если бы вы ждали еще несколько миллисекунд, это было бы там. Но правильный способ сделать это - прослушать AVCaptureInputPortFormatDescriptionDidChangeNotification.

4). Ваш класс JAViewController создает объект PVCameraInfo в retrieveCameraInfo: и задает ему вопрос, а затем позволяет ему выпасть из области действия, где он выпущен и отменен.

Таким образом, сеанс недостаточно длинный для выполнения запроса размеров. Вы слишком быстро останавливаете камеру.

Мы рассматриваем этот вопрос как закрытый. Если у вас есть какие-либо вопросы или проблемы по этой проблеме, пожалуйста, немедленно обновите отчет (http://bugreport.apple.com).

Спасибо, что нашли время сообщить нам об этой проблеме.

С наилучшими пожеланиями,

Команда отчетов об ошибках разработчиков Отношения с разработчиками Apple по всему миру

Ответ 4

Может быть, вы можете предоставить список всех возможных предустановленных разрешений для каждой модели iPhone и проверить, какая модель устройства работает? - используя что-то вроде этого...

[[UIDevice currentDevice] platformType]   // ex: UIDevice4GiPhone
[[UIDevice currentDevice] platformString] // ex: @"iPhone 4G"

Однако вам нужно обновить список для каждой новой модели устройства. Надеюсь, это поможет:)

Ответ 5

Вы можете программно получить разрешение от activeFormat до начала записи, но не до добавления входов и выходов: https://developer.apple.com/library/ios/documentation/AVFoundation/Reference/AVCaptureDevice_Class/index.html#//apple_ref/occ/instp/AVCaptureDevice/activeFormat

private func getCaptureResolution() -> CGSize {
    // Define default resolution
    var resolution = CGSize(width: 0, height: 0)

    // Get cur video device
    let curVideoDevice = useBackCamera ? backCameraDevice : frontCameraDevice

    // Set if video portrait orientation
    let portraitOrientation = orientation == .Portrait || orientation == .PortraitUpsideDown

    // Get video dimensions
    if let formatDescription = curVideoDevice?.activeFormat.formatDescription {
        let dimensions = CMVideoFormatDescriptionGetDimensions(formatDescription)
        resolution = CGSize(width: CGFloat(dimensions.width), height: CGFloat(dimensions.height))
        if (portraitOrientation) {
            resolution = CGSize(width: resolution.height, height: resolution.width)
        }
    }

    // Return resolution
    return resolution
}

Ответ 6

Apple использует соотношение 4: 3 для камеры iPhone.

Вы можете получить это соотношение, чтобы получить размер кадра захваченного видео, установив ограничение ширины или высоты AVCaptureVideoPreviewLayer и установив ограничение соотношения сторон в 4: 3.

4: 3 Ratio

В левом изображении ширина была зафиксирована на 300 пикселей, а высота была восстановлена ​​путем установки отношения 4: 3, и это было 400 пикселей.

В правильном изображении высота была зафиксирована до 300 пикселей, и ширина была восстановлена ​​путем установки отношения 3: 4, и это было 225 пикселей.