Измерение видео iOS8, CMVideoDimensions возвращает 0,0

В iOS8 возвращаемое измерение равно 0,0

CMVideoDimensions dimensions = CMVideoFormatDescriptionGetDimensions(formatDescription);

Это работало на iOS7, так как узнать поддерживаемое измерение видео, так как мне нужно знать соотношение сторон видео

2 ответа

Решение

Вам нужно дождаться AVCaptureInputPortFormatDescriptionDidChangeNotification

- (void)avCaptureInputPortFormatDescriptionDidChangeNotification:(NSNotification *)notification {

    AVCaptureInput *input = [self.recorder.captureSession.inputs objectAtIndex:0];
    AVCaptureInputPort *port = [input.ports objectAtIndex:0];
    CMFormatDescriptionRef formatDescription = port.formatDescription;
    if (formatDescription) {
        CMVideoDimensions dimensions = CMVideoFormatDescriptionGetDimensions(formatDescription);
        if ((dimensions.width == 0) || (dimensions.height == 0)) {
            return;
        }
        CGFloat aspect = (CGFloat)dimensions.width / (CGFloat)dimensions.height;

        if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_7_1) {
            // since iOS8 the aspect ratio is inverted
            // remove this check if iOS7 will not be supported
            aspect = 1.f / aspect;
        }

    }

}

Если вы отслеживаете используемое устройство, вы можете получить доступ к текущему формату из activeFormat: https://developer.apple.com/library/ios/documentation/AVFoundation/Reference/AVCaptureDevice_Class/index.html

Недавно я столкнулся с этой конкретной проблемой, вот версия Swift 5 для тех, кому она тоже нужна:

import Foundation
import AVFoundation

class MySessionManager: NSObject {
    static let notificationName = "AVCaptureInputPortFormatDescriptionDidChangeNotification"
    let session: AVCaptureSession

    var videoCaptureDimensions: CMVideoDimensions?

    init(session: AVCaptureSession) {
       self.session = session

       let notificationName = NSNotification.Name()

       NotificationCenter.default.addObserver(
           self, 
           selector: #selector(formatDescription(didChange:)),
           name: .init(Self.notificationName), 
           object: nil
       )
    }

    deinit { NotificationCenter.default.removeObserver(self) }

    @objc func formatDescription(didChange notification: NSNotification) {
        guard
            let input = session.inputs.first,
            let port = input.ports.first,
            let formatDesc = port.formatDescription
        else { return }

        var dimensions = CMVideoFormatDescriptionGetDimensions(formatDesc)

        // ... perform any necessary dim adjustments ...

        videoCaptureDimensions = dimensions
    }
}
Другие вопросы по тегам