Видеофрагментация устарела

#objective-c #xcode #ios7 #gpuimage

#objective-c #xcode #ios7 #изображение графического процессора

Вопрос:

Когда я обновил Xcode с 4.6 до 5.1, `Videominn frameDuration» устарел в ios7

 - (void)setFrameRate:(NSInteger)frameRate;
 {
_frameRate = frameRate;

if (_frameRate > 0)
{
    for (AVCaptureConnection *connection in videoOutput.connections)
    {

        if ([connection respondsToSelector:@selector(setVideoMinFrameDuration:)])
            connection.videoMinFrameDuration = CMTimeMake(1,_frameRate);
  

Комментарии:

1. устаревший метод означает, что он устарел из-за проблемы с безопасностью, потому что новый метод делает то же самое или по любой другой причине. Он включен только для того, чтобы устройства, работающие с более старыми версиями xcode, все еще могли запускать ваш код. В целях безопасности кода и переносимости вам больше не следует его использовать. Обратитесь к документации, чтобы узнать, какой метод использовать вместо этого.

Ответ №1:

Во-первых, вы используете устаревшую версию GPUImage, поскольку это было исправлено в коде фреймворка почти год назад. Обновите локальную версию фреймворка.

Способ, которым я решаю эту проблему в GPUImage, поскольку мне все еще нужно использовать этот метод для старых версий iOS, заключается в отключении проверок на устаревание соответствующего кода:

     if ([_inputCamera respondsToSelector:@selector(setActiveVideoMinFrameDuration:)] amp;amp;
        [_inputCamera respondsToSelector:@selector(setActiveVideoMaxFrameDuration:)]) {

        NSError *error;
        [_inputCamera lockForConfiguration:amp;error];
        if (error == nil) {
#if defined(__IPHONE_7_0)
            [_inputCamera setActiveVideoMinFrameDuration:CMTimeMake(1, _frameRate)];
            [_inputCamera setActiveVideoMaxFrameDuration:CMTimeMake(1, _frameRate)];
#endif
        }
        [_inputCamera unlockForConfiguration];

    } else {

        for (AVCaptureConnection *connection in videoOutput.connections)
        {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
            if ([connection respondsToSelector:@selector(setVideoMinFrameDuration:)])
                connection.videoMinFrameDuration = CMTimeMake(1, _frameRate);

            if ([connection respondsToSelector:@selector(setVideoMaxFrameDuration:)])
                connection.videoMaxFrameDuration = CMTimeMake(1, _frameRate);
#pragma clang diagnostic pop
        }
    }
  

Если доступно новое свойство ( activeVideoMinFrameDuration ), мы используем его. Если нет, он возвращается к устаревшему методу. Поскольку мы знаем, что он устарел, нет необходимости, чтобы компилятор предупреждал нас об этом.

Ответ №2:

В AVCaptureSession.h класс AVFoundation упоминается в следующем комментарии.

 @property supportsVideoMinFrameDuration
 @abstract
    Indicates whether the connection supports setting the videoMinFrameDuration property.

 @discussion
    This property is only applicable to AVCaptureConnection instances involving
    video.  In such connections, the videoMinFrameDuration property may only be set if
    -isVideoMinFrameDurationSupported returns YES.

    This property is deprecated on iOS, where min and max frame rate adjustments are applied
    exclusively at the AVCaptureDevice using the activeVideoMinFrameDuration and activeVideoMaxFrameDuration
    properties.  On Mac OS X, frame rate adjustments are supported both at the AVCaptureDevice
    and at AVCaptureConnection, enabling connections to output different frame rates.